5
/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*\W+)(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/

パスワードが少なくとも8文字で、大文字、小文字、数字、および特殊文字が1つずつ含まれている必要があるように、パスワード検証用の正規表現を作成しようとしています。アンダースコア (_) を特殊文字として認識しないことを除けば、正常に動作します。つまり、Pa$$w0rd は一致しますが、Pass_w0rd は一致しません。考え?

4

4 に答える 4

3

正規表現のこの部分は、特殊文字を探しているようです:

(?=.*[!@#$%^&*-])

文字クラスにはアンダースコアが含まれていないことに注意してください。これを次のように変更してみてください。

(?=.*[_!@#$%^&*-])

また、正規表現のこの部分を変更または削除する必要があります。

(?=.*\W+)

\Wと同等[^a-zA-Z0-9_]であるため、アンダースコアが唯一の特殊文字である場合、正規表現のこの部分が原因で失敗します。代わりに、次のように変更します (または削除します。以前に特殊文字を既にチェックしているため、冗長です)。

(?=.*[^\w_])

完全な正規表現:

/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*[^\w_])(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/
于 2012-06-04T21:47:49.617 に答える
2

これもここで動作します。英数字と空白を除外することで特殊文字を定義するため、アンダースコアが含まれます。

(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[\d])(?=.*?[^\sa-zA-Z0-9]).{8,}
于 2015-10-01T09:46:25.700 に答える
1

問題は、定義上、 を満たす可能性のある唯一のものは\W以外のものであるということです[a-zA-Z0-9_]。アンダースコアは特に と一致し\WませPass_w0rdん。

特定の特殊文字のリストと の両方を持つのはやり過ぎだと思います。\Wどちらかを選べば、きっと幸せになれます。また、保守性を大幅に向上させるために、この全体をいくつかの個別のテストに分割することをお勧めします。

于 2012-06-04T21:50:57.823 に答える
1

あなたのために働くはるかに単純な正規表現はこれです:

/(?=.*[_!@#$%^&*-])(?=.*\d)(?!.*[.\n])(?=.*[a-z])(?=.*[A-Z])^.{8,}$/

元の正規表現にはいくつかの間違いがありました:

  • 入力に8文字があることを確認するために先読みを使用する必要はありません
  • 否定先読み[.\n]がありませんでした.*
  • (?=.*\W+)余分であり、おそらく何の役にも立たない
于 2012-06-04T21:52:39.950 に答える