2

我有以下正则表达式来检查密码策略。它经过验证可以工作:

(^([zZ]\d{3})*$)|((?=.{9,})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*)

我想在 bash 脚本中使用正则表达式通过以下方式验证 psssword:

echo $password | grep "(^([zZ]\d{3})*$)|((?=.{9,})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*)"
if [[ $? -eq 0 ]] ; then

这在 bash 中不起作用。我的问题是:

如何将此“纯”正则表达式转换为可在 bash 中使用的正则表达式?我需要转义哪些字符,将正则表达式传递给 grep 的正确方法是什么?还有什么我需要注意的吗?

谢谢

4

1 回答 1

4

这可能很困难。

标准grep的功能有限。它只支持 POSIX 扩展的正则表达式,它不能识别你的正则表达式所依赖的前瞻断言。

如果你grep的机器上有 GNU,你可以给它传递-Por--perl-regexp参数,允许它使用 Perl 兼容的正则表达式。那么你的正则表达式应该可以工作。

正如我在评论中提到的,正则表达式不适合密码验证。它允许密码z000,甚至是空字符串:

(                 # Either match and capture...
 ^                #  Start of the string
 (                #  Match (and capture, uselessly in this case)
  [zZ]            #  case-insensitive z
  \d{3}           #  three digits
 )*               #  zero(!) or more times
 $                #  until the end of the string
)                 # End of first group.
|                 # OR
(                 # match and capture...
  (?=.{9,})       #  a string that's at least 9 characters long,
  (?=.*?[^\w\s])  #  contains at least one non-alnum, non-space character,
  (?=.*?[0-9])    #  at least one ASCII digit
  (?=.*?[A-Z])    #  at least one ASCII uppercase letter
  .*?[a-z].*      #  and at least one ASCII lowercase letter
)                 # no anchor to start/end of string...

更好的使用

^(?=.{9})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*$
于 2012-04-19T07:53:42.167 回答