2013-10-21 32 views
10

正規表現を検索していますが、少なくとも2桁の数字と1文字の特殊文字を使用でき、パスワードの最小長は8です。次のようになります。[[email protected]#$%0-9]*[[email protected]#$%0-9]+[[email protected]#$%0-9]*パスワードの正規表現(少なくとも2桁と特殊文字1個、最小長8)

+0

[パスワード検証のための正規表現]の複製が可能です(http://stackoverflow.com/questions/7245267/regular-expressions-for-password-validation) – Toto

答えて

3

この正規表現を試してください。先読みを使用して、少なくとも2桁の数字とあなたが指定した特殊文字の1つがあることを確認します。

^(?=.*?[0-9].*?[0-9])(?=.*[[email protected]#$%])[[email protected]#$%0-9]{8,}$ 

^ #Match start of line. 

(?=.*?[0-9].*?[0-9]) #Look ahead and see if you can find at least two digits. Expression will fail if not. 

(?=.*[[email protected]#$%]) #Look ahead and see if you can find at least one of the character in bracket []. Expression will fail if not. 

[[email protected]#$%0-9]{8,} #Match at least 8 of the characters inside bracket [] to be successful. 

$ # Match end of line. 
+0

0-9のように見えますが、あなたの文字のリストで2回宣言されています:[0-9a-zA-Z!@#$%0-9] – blatt

28

このようなものは、このトリックを行うべきです。

^(?=(.*\d){2})(?=.*[a-zA-Z])(?=.*[[email protected]#$%])[[email protected]#$%]{8,} 

(?=(.*\d){2}) - uses lookahead (?=) and says the password must contain at least 2 digits 

(?=.*[a-zA-Z]) - uses lookahead and says the password must contain an alpha 

(?=.*[[email protected]#$%]) - uses lookahead and says the password must contain 1 or more special characters which are defined 

[[email protected]#$%] - dictates the allowed characters 

{8,} - says the password must be at least 8 characters long 

少し微調整が必​​要な場合があります。あなたが必要とする特殊文字を正確に指定しますが、そのトリックを行うべきです。

+0

これは非常に便利で詳細なものでしたが、ここに来る他の人にとって私はこのガイド[http://www.cheatography.com/ davechild/cheat-sheets/regular-expressions /)を使って、あなたの答えをもう少しカスタマイズすることができます。 – CupOfJoe

3

試してみてください、この1:それはすぐにどのように動作するか

ここ
^(?=.*\d{2,})(?=.*[$-/:-?{-~!"^_`\[\]]{1,})(?=.*\w).{8,}$ 

です:

  • (?=.*\d{2,})この部分は、少なくとも2桁を除いて言っ
  • (?=.*[$-/:-?{-~!"^_ [] {1、}) `これら少なくとも1の特殊文字です
  • (?=.*\w)と残りは任意の文字です([A-Za-z0-9_]に等しい)
  • .{8,}$これは以前のすべてのルールを含む少なくとも8文字です。以下 は(Regexperの助けを借りて作られた)現在の正規表現

regexpはこの^(?=(.*\d){2,})(?=.*[$-\/:-?{-~!"^_'\[\]]{1,})(?=.*\w).{8,}$ チェックアウトの詳細についてのコメントのようになります Regexp map UPDのマップです。

+1

これは連続している場合にのみ2桁に一致しますが、パスワードの場合はそうではありません。 – justhalf

+0

@justhalf、はい、そうです。数字のある部分は、この '(?=(。* \ d){2、})'のようになります。このような正規表現は '^(?= \ d){2、})(?=。* [$ - \ /: - ?{ – Valerii

0

正規表現は、一致させようとしている文字列の構造体を定義します。正規表現に空間構造を定義していない場合(、少なくとも2桁に続いて特殊文字、...など)、regexを使用して文字列を検証することはできません。

8

すべてのルールを1つの正規表現に実装する理由はありません。 ので、同じようにそれをやって考えてみましょう:

Pattern[] pwdrules = new Pattern[] { 
    Pattern.compile("........"), // at least 8 chars 
    Pattern.compile("\d.*\d"),  // 2 digits 
    Pattern.compile("[-!"§$%&/()=?+*~#'_:.,;]") // 1 special char 
    } 

String password = ......; 
boolean passed = true; 

for (Pattern p : pwdrules) { 
    Matcher m = p.matcher(password); 
    if (m.find()) continue; 
    System.err.println("Rule " + p + " violated."); 
    passed = false; 
} 

if (passed) { .. ok case.. } 
else { .. not ok case ... } 

このpasswort規則は、追加、削除または努力なしに変更することができるという付加的な利点を持っています。彼らはいくつかのressourceファイルに存在することさえできます。

さらに、わかりやすいです。

+0

"1つの正規表現ですべてのルールを実装する理由はありません。" それをどうやって知っていますか? – drowa

+0

(?=。* \ w)。 @drowa理由は何でしょうか – Ingo

+0

パスワードフィールドの検証のために正規表現しか受け付けないCMSシステムを想像してください。このCMSシステムを変更することはできません。 – drowa

関連する問題