0

文字列である引数に少なくとも 2 つのカテゴリから少なくとも 2 つの文字が含まれている場合に true を返す関数を作成しています。

  • 小文字
  • 大文字
  • 数字の文法
  • キャラクター/その他すべて

例:

abAB => true
aB => false
ab12 => true
1ab2 => true
asdfasdf1 => false

これを行う正規表現に取り組んでいますが、問題があります。また、正規表現を複数の if ステートメントに分割し、各グループから少なくとも 2 文字が文字列に含まれているかどうかを個別に確認することも検討しました。

例えば:

comprised = 0
if(string contains *[0-9]*[0-9])
    comprised = comprised+1
if(string contains *[a-b]*[a-b])
    comprised = comprised+1
if(string contains *[A-Z]*[A-Z])
    comprised = comprised+1
if(string contains *[^0-9a-zA-Z]*[^0-9a-zA-Z])
    comprised = comprised+1

if comprised >= 2
    return true
else return false
4

2 に答える 2

3

この状況では、正規表現は本当に必要ありません。以下の Java コードは、それを解決する別の方法を示しています。

public static boolean validate(String s) {
    int[] group = new int[4];
    for (char c : s.toCharArray()){
        group[getGroupForChar(c)]++;
    }
    int large = 0;
    for (int g : group){
        if (g >= 2)large++;
    }
    return large>=2;
}
private static int getGroupForChar(char c) {
    if (Character.isLowerCase(c))return 0;
    else if (Character.isUpperCase(c))return 1;
    else if (Character.isDigit(c))return 2;
    return 3;
}
public static void main(String[] args) {
    String[] tests = new String[]{
        "abAB",
        "aB",
        "ab12",
        "1ab2",
        "asdfasdf1"
    };

    for (String s : tests) {
        System.out.println(s+": "+validate(s));
    }
}

出力:

abAB: true
aB: false
ab12: true
1ab2: true
asdfasdf1: false

コードをテストできるサイト: fiddle

于 2013-02-01T23:15:57.063 に答える
1

これ.*[a-z].*[a-z].*は、2つの小文字が含まれるすべての文字列と一致します。

これ[a-z]は、単一の小文字に一致します。

最初のような3つの正規表現を作成し、それらを適用して、そこに何があるかを確認します。そこにある場合は、そのカテゴリを数えます。

テストに適用した後、2番目の文字を使用して、そのタイプのすべての文字を削除するか、空の文字列などに置き換えます。

上、下、数字について繰り返します。次に、文字が残っているかどうかを確認し、4番目のカテゴリを数えます。

カウントが2以上の場合は問題ありません。

警告文字列には終了文字が含まれていないと見なされます。

于 2013-02-01T22:48:31.973 に答える