Единственное, чего не хватает в вашем регулярном выражении - это добавление начальных ^
и $
конечных якорей и правильная группировка всего вашего регулярного выражения. Я также удалил ненужные группировки из вашего регулярного выражения, и вы можете использовать это регулярное выражение,
^(?:(?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[\d])|(?=.*[A-Z])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[a-z])|(?=.*[!#+,.\\=:=@-])(?=.*[A-Z])).+$
Regex Demo
Хотя этот подход работает, но я предлагаю вам написать код для достижения этого, так как это регулярное выражение может быть непригодным для людей в целом.
Подход Java Code для проверки строк, а не чисто больших регулярных выражений
Ниже приведен подход с использованием 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