2

パスワードポリシーをチェックする次の正規表現があります。動作することが検証されています:

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

次の方法でpssswordを検証するために、bashスクリプトで正規表現を使用したいと思います。

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 拡張正規表現のみをサポートします。

マシンにGNU がある場合は、またはパラメータgrepを渡して、Perl 互換の正規表現を使用できるようにします。次に、正規表現が機能するはずです。-P--perl-regexp

私のコメントで述べたように、そのままの正規表現はパスワードの検証には適していません。次のようなパスワード、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 に答える