您的正则表达式中唯一缺少的是添加 start ^ 和 $ 结束锚点并正确分组整个正则表达式。我还从您的正则表达式中删除了不必要的分组,您可以使用此正则表达式,
^(?:(?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[\d])|(?=.*[A-Z])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[a-z])|(?=.*[!#+,.\\=:=@-])(?=.*[A-Z])).+$
Regex Demo
虽然这种方法有效,但我建议您编写代码来实现这一点,因为一般人可能无法维护这个正则表达式。
验证字符串而不是纯正则表达式的 Java 代码方法
以下是一种使用 Java 代码的方法,您可以将模式的List 以及要验证的字符串和匹配所需的最小模式的数字一起传递给方法。检查此代码,
public static void main(String[] args) {
int minRequiredMatch = 2;
List<String> list = Arrays.asList("wel123","123@@!","@@@aaa","!!!BDC","ABC123","rrirrra","1234567","ABCFESS","@@@!!!!");
list.forEach(x -> {
System.out.println(x + " - " + (validateTwoCharSets(x, minRequiredMatch)?"Valid":"Invalid"));
});
}
public static boolean validateTwoCharSets(String str, int minRequiredMatch) {
List<Pattern> patList = new ArrayList<>();
patList.add(Pattern.compile("[a-z]"));
patList.add(Pattern.compile("[A-Z]"));
patList.add(Pattern.compile("[0-9]"));
patList.add(Pattern.compile("[!#+,-./:=@]"));
return validateTwoCharSets(patList, str, minRequiredMatch);
}
public static boolean validateTwoCharSets(List<Pattern> patList, String str, int minRequiredMatch) {
if (minRequiredMatch <0 || minRequiredMatch > patList.size()) {
throw new RuntimeException("minRequiredMatch must be a positive number and not more than pattern list size.");
}
int matchCount = 0;
for (Pattern p : patList) {
Matcher m = p.matcher(str);
if (m.find()) {
matchCount++;
}
if (matchCount >= minRequiredMatch) {
return true;
}
}
return false;
}
对于您给定的数据集打印如下,
wel123 - Valid
123@@! - Valid
@@@aaa - Valid
!!!BDC - Valid
ABC123 - Valid
rrirrra - Invalid
1234567 - Invalid
ABCFESS - Invalid
@@@!!!! - Invalid