Regex для проверки как минимум двух классов символов (буквы, цифры, специальные символы) - PullRequest
0 голосов
/ 02 мая 2019

Я хочу сопоставить как минимум два символьных класса в java для входной строки, которая содержит только маленькие буквы [az], заглавные буквы [AZ], цифры [0-9], специальные символы [! # +, -. / : = @].

Я пришел к указанному ниже регулярному выражению, но оно не работает:

((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[\\d]))|((?=.*[A-Z])(?=.*[\\d]))|((?=.*[!#+,.\\=:=@-])(?=.*[\\d]))|((?=.*[!#+,.\\=:=@-])(?=.*[a-z]))|((?=.*[!#+,.\\=:=@-])(?=.*[A-Z]))

Примеры:

wel123 - valid
123@@! - valid
@@@aaa - valid
!!!BDC - valid
ABC123 - valid
rrirrra - invalid
1234567 - invalid
ABCFESS - invalid
@@@!!!! - invalid

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Единственное, чего не хватает в вашем регулярном выражении - это добавление начальных ^ и $ конечных якорей и правильная группировка всего вашего регулярного выражения. Я также удалил ненужные группировки из вашего регулярного выражения, и вы можете использовать это регулярное выражение,

^(?:(?=.*[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
0 голосов
/ 02 мая 2019

Я понимаю, что вам нужно регулярное выражение, соответствующее любой строке, содержащей не менее 2 последовательных символов из заданного вами набора.

Я бы пошел с этим:

.*[\w\d!#+,-./:=@]{2}.*

См. Полный код:

package so20190502;

public class TwoOrMoreChars {

    public TwoOrMoreChars() {
    }

    public boolean matches(String s) {
        return s.matches(".*[\\w\\d!#+,-./:=@]{2}.*");
    }

    private void testString(String s) {
        System.out.println("String '" + s + "' does " + (matches(s)?"":"NOT") + " match.");
    }

    public static void main(String[] args) {
        TwoOrMoreChars me = new TwoOrMoreChars();
        me.testString("1");
        me.testString("1%2");
        me.testString("1%2%a%-%'");
        me.testString("1%2a-'");
    }

}

Это выводит:

String '1' does NOT match.
String '1%2' does NOT match.
String '1%2%a%-%'' does NOT match.
String '1%2a-'' does  match.

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...