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].*将匹配其中包含两个小写字符的任何字符串。

[a-z]将匹配单个小写字符。

像第一个一样组成 3 个正则表达式,然后应用它们来看看有什么。如果它在那里,请计算该类别。

将其应用于测试后,使用第二个删除该类型的所有字符或将其替换为空字符串等。

重复上、下和数字。然后看有没有剩下的字符,算第4类。

如果计数为 2 或更多,则很好。

警告假定字符串中没有结束符。

于 2013-02-01T22:48:31.973 回答