Regex допускает только один (возможно, повторный) символ из данного класса символов - PullRequest
1 голос
/ 14 апреля 2020

Мне нужно проверить, содержит ли строка только один отдельный символ из данного класса символов. Несколько простых примеров:

"aa", "bbbbb", "c" соответствует этому регулярному выражению [abc]+, но регулярное выражение также соответствует "abbb" or "abcbb", что недопустимо в моем случае. Поэтому я не могу его использовать.

Пример кода:

String[] input = {"a", "aaa", "ab", "b", "bbbb", "abc", "ccc"};
for(String str :input){
    if(str.matches("[abc]+")){
        System.out.println(str + ": valid");
    }
    else {
        System.out.println(str + ": not valid");
    }
}

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

for(String str :input){
    if(str.matches("[a]+")||str.matches("[b]+")||str.matches("[c]+")){
        System.out.println(str + ": valid");
    }
    else {
        System.out.println(str + ": not valid");
    }
}

Как мне достичь того же результата, что и во втором подходе, но записать его компактно, потому что это будет не будет читаемым, когда класс персонажа растет и происходят изменения в классе персонажа. Мне нужно изменить условие if?

Ожидается:

a: valid
aaa: valid
ab: not valid
b: valid
bbbb: valid
abc: not valid
ccc: valid

Ответы [ 2 ]

3 голосов
/ 14 апреля 2020

Вы можете использовать \1 (экранированный как \\1) для ссылки на совпадение первой подгруппы, поэтому что-то вроде:

^([a-z])\1+$

.. будет соответствовать az, за которым следует хотя бы один раз в качестве единственного символы в строке (^ и $ могут быть неявными с .matches, я не слишком знаком с Java специфическим c проблемами с регулярными выражениями).

Затем вам потребуется еще одна проверка, чтобы увидеть если строка имеет длину 1 и содержит a-z (если вы хотите избежать разрешения 1, 2 и т. д. c. и других специальных символов).

2 голосов
/ 14 апреля 2020

См. «Повторяющиеся классы символов» в https://www.regular-expressions.info/charclass.html

TL; DR; ^([a-z])\1*$

Примечание: Тар драконы, в зависимости от силы цитирования, вам может потребоваться двойной выход из обратного хода sh: ^([a-z])\\1*$

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