1

次の場合の正規表現がどのようになるかを知る必要があります。

  • 8 文字以上( ... ).{8,}
  • 文字あり(?=.*[a-z|A-Z])
  • 番号あり(?=.*\d)
  • 特殊文字あり(?=.*[~'!@#$%?\\\/&*\]|\[=()}"{+_:;,.><'-])

私は他の正規表現に基づいて以下を得ました:

((?=.*\d)(?=.*[a-z|A-Z])(?=.*[~'!@#$%?\\\/&*\]|\[=()}"{+_:;,.><'-])).{8,}

ただし、次の場合は失敗します。

qwer!234

任意のヒント?

4

4 に答える 4

4

Java 正規表現では、文字列のエスケープ規則により、バックスラッシュを 2 つにする必要があります。

Pattern regex = Pattern.compile("^(?=.*\\d)(?=.*[a-zA-Z])(?!\\w*$).{8,}");

動作するはずです。

説明:

^              # Start of string
(?=.*\d)       # Assert presence of at least one digit
(?=.*[a-zA-Z]) # Assert presence of at least one ASCII letter
(?!\w*$)       # Assert that the entire string doesn't contain only alnums
.{8,}          # Match 8 or more characters
于 2013-03-05T20:26:01.780 に答える
1

これらすべての特殊文字を使用すると、すべてを適切にエスケープできなかった可能性が中程度になります。

あなたはJavaを正しく言いましたか?これは印刷しますtrue

String regex = "((?=.*\\d)(?=.*[a-zA-Z])(?=.*[~'!@#$%?\\\\/&*\\]|\\[=()}\"{+_:;,.><'-])).{8,}";
System.out.println("qwer!234".matches(regex));

しかし、これはかなり単純です。

String regex = "(?=.*?\\d)(?=.*?[a-zA-Z])(?=.*?[^\\w]).{8,}";
于 2013-03-05T20:20:14.120 に答える
1

これをすべて単一の正規表現に入れるのはなぜですか? チェックごとに個別の関数を作成するだけで、コードの理解と保守がはるかに簡単になります。

if len(password) > 8 &&
   has_alpha(password) &&
   has_digit(password) &&
    ...

ビジネス ロジックはすぐに理解できます。さらに、他の条件を追加する場合でも、トリッキーな正規表現を変更する必要はありません。

于 2013-03-05T20:25:27.887 に答える
0
Pattern letter = Pattern.compile("[a-zA-z]");  
Pattern digit = Pattern.compile("[0-9]");  
Pattern special = Pattern.compile ("[!@#$%&*()_+=|<>?{}\\[\\]~-]");  
Pattern eight = Pattern.compile (".{8}");  
...  
public final boolean ok(String password) {  
   Matcher hasLetter = letter.matcher(password);  
   Matcher hasDigit = digit.matcher(password);  
   Matcher hasSpecial = special.matcher(password);  
   Matcher hasEight = eight.matcher(password);  
   return hasLetter.find() && hasDigit.find() && hasSpecial.find()  
      && hasEight.matches();  
}  

それは動作します。

于 2013-07-04T05:43:46.350 に答える