9

パターンマッチ(パスワード用)に正規表現を作成しようとしています。文字列は8〜30文字で、2桁以上、2文字以上(大文字と小文字を区別しない)、特殊文字1文字以上である必要があります。場所がない。

スペースと特殊文字のマッチングは機能していますが、2桁と2文字は連続している必要がないため、スローされます。

a1b2c$ つまり、またはab12$またはと一致する必要があり1aab2c$ます。

手紙のためにこのような何か?

(?=.*[a-zA-Z].*[a-zA-Z])  // Not sure.

以下のこの文字列は機能しますが、2つの文字が連続していて、2つの数字が連続している場合にのみ機能します。文字、数字、特殊文字が織り交ぜられている場合は失敗します。

(?=^.{8,30}$)((?=.*\\d)(?=.*[A-Za-z]{2})(?=.*[0-9]{2})(?=.*[!@#$%^&*?]{1})(?!.*[\\s]))^.* 
4

4 に答える 4

9

文字を連続させたくない場合(?=.*[a-zA-Z].*[a-zA-Z])は、正しいアプローチです。同じことが数字(?=.*\\d.*\\d)またはに当てはまります(?=(.*\\d){2})

この正規表現を試してください

(?=^.{8,30}$)(?=(.*\\d){2})(?=(.*[A-Za-z]){2})(?=.*[!@#$%^&*?])(?!.*[\\s])^.*
于 2013-03-13T19:03:39.643 に答える
5

あなたの推測はかなり正確でしょう。パレンでもう少しエレガントに見せることができます。

(?=(.*[a-zA-Z]){2})

しかし、あなたは正しい方向に進んでいるように聞こえます。

于 2013-03-13T19:01:00.263 に答える
3

ループを使用して文字列をトラバースします。

/**
 * Checks to see if the specified string has between 8 and 30 characters, has at least 2 digits, at least 2 letters, at least one special character, and no spaces.
 * @param s the String to be checked
 * @return s, if it passes the above test
 * @throws IllegalArgumentException if it does not
 */
public static String check(String s)
{
    IllegalArgumentException invalid = new IllegalArgumentException();
    if(s.length() < 8 || s.length() > 30)
        throw invalid;
    int letters = 0, numbers = 0, specialChars = 0;
    for(char c : s.toCharArray())
    {
        if(c == ' ')
            throw invalid;
        else if(Character.isLetter(c))
            ++letters;
        else if(Character.isDigit(c))
            ++numbers;
        else
            ++specialChars;

    }
    if(letters < 2 || numbers < 2 || specialChars < 1)
        throw invalid;
    return s;
}
于 2013-03-13T19:04:28.860 に答える
0

私はあなたが提供するあなたの例が8から30文字ではないことを観察します

8〜30文字が必要な場合は、このパターンを1回試してください

 (?=[^\s]*[^\sa-zA-Z0-9][^\s]*)(?=[^\s]*[a-zA-Z][^\s]*[A-Za-z][^\s]*)(?=[^\s]*\d[^\s]*\d[^\s]*)[^\s]{8,30}
于 2013-03-13T18:58:17.580 に答える