0

サイトを検索しましたが、探しているものが正確に見つかりません。パスワード基準:

  1. 6 文字、最大 50 文字にする必要があります
  2. 1 つの英字を含める必要があります
  3. 1 つの数字または特殊文字を含める必要があります

ここに私がJavaで持っているものがあります:

public static Pattern p = Pattern.compile(
 "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])|(?=.*[\\d~!@#$%^&*\\(\\)_+\\{\\}\\[\\]\\?<>|_]).{6,50})"
);

問題は、1234567 のパスワードが一致する (有効である) ことです。

どんな助けでも素晴らしいでしょう。

4

6 に答える 6

5

それを行うために単一の正規表現を使用しようとはしません。正規表現は、長く複雑になるとうまく機能しない傾向があります。

boolean valid(String password){
    return password != null &&
    password.length() >= 6 &&
    password.length() <= 50 &&
    password.matches(".*[A-Za-z].*") &&
    password.matches(".*[0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_+\\{\\}\\[\\]\\?<>|_].*");
}
于 2013-05-13T17:51:31.857 に答える
1

Matcher.matches()文字列全体がパターンに一致することをアサートするメソッドを必ず使用してください。

現在の正規表現:

"((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])|(?=.*[\\d~!@#$%^&*\\(\\)_+\\{\\}\\[\\]\\?<>|_]).{6,50})"

意味:

  • 文字列には、少なくとも 1 つの数字(?=.*\\d)、小文字の英語のアルファベット(?=.*[a-z])、および大文字の文字が含まれている必要があります(?=.*[A-Z])
  • または|文字列には、数字または特殊文字の可能性がある文字が少なくとも 1 つ含まれている必要があります(?=.*[\\d~!@#$%^&*\\(\\)_+\\{\\}\\[\\]\\?<>|_])
  • 上記のいずれかの条件が当てはまり、文字列の長さは 6 ~ 50 文字で、行区切り文字を含まない必要があります。

正しい正規表現は次のとおりです。

"(?=.*[a-zA-Z])(?=.*[\\d~!@#$%^&*()_+{}\\[\\]?<>|]).{6,50}"

これはチェックします:

  • 文字列には、英語のアルファベット文字 (大文字または小文字)(?=.*[a-zA-Z])と、数字または特殊文字のいずれかの文字が含まれている必要があります(?=.*[\\d~!@#$%^&*()_+{}\\[\\]?<>|])
  • 文字列は 6 ~ 50 文字である必要があり、行区切りは含まれません。

文字クラス内での特別な意味が失われるため[]、を除くほとんどの文字のエスケープを削除したことに注意してください。{}?()

于 2013-05-13T18:05:08.533 に答える
1

正規表現は、決定論的有限オートマトンとして表現できる言語、つまりメモリを必要としない言語にのみ一致します。特殊文字と英字をカウントする必要があるため、メモリが必要になるため、DFA ではこれを行うことができません。ルールは単純ですが、パスワードをスキャンしてその長さを判断し、必要な文字が使用可能であることを確認するだけで済みます。

于 2013-05-13T17:53:54.787 に答える
1

文字と長さの検証を分離することをお勧めします。

boolean checkPassword(String password) {
    return password.length() >= 6 && password.length() <= 50 && Pattern.compile("\\d|\\w").matcher(password).find();
}
于 2013-05-13T17:55:20.400 に答える
0

別の正規表現に分割することをお勧めします

$re_numbers = "/[0-9]/";
$re_letters = "/[a-zA-Z]/";

両方が一致する必要があり、長さも個別にテストされます。その場合、コードは非常にきれいに見え、理解しやすく、変更しやすくなります。

于 2013-05-13T17:51:47.023 に答える
0

このような単純なタスクには、この方法は複雑すぎます。

String#length() を使用して長さを検証する

password.length() >= 6 && password.length() <= 50

Matcher#find() を使用して各グループを検証する

Pattern alpha = Pattern.compile("[a-zA-Z]");
boolean hasAlpha = alpha.matcher(password).find();
Pattern digit = Pattern.compile("\d");
boolean hasDigit = digit.matcher(password).find();
Pattern special = Pattern.compile("[\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_+\\{\\}\\[\\]\\?<>|_]");
boolean hasSpecial = special.matcher(password).find();
于 2013-05-13T17:51:55.357 に答える