Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Регулярное выражение с набором разрешенных значений

#c_sharp #linux #регулярные_выражения #веб_программирование


Возможно ли в рамках одной регулярки реализовать следующее:

Есть строка в которую пользователь может вводить все что угодно, но есть одно НО!

Есть перечень слов, которые должны употребляться только с определенной цифрой:

20 гв
30 гв
45 гв

Т.е если юзер ввел строчку: 123 qwe 20 гв. Все ок. Совпадение есть

Если юзер вбил 100500 гв 123 qwe, то совпадений нет, так сочетание 100500 гв отсутствует
в списке.
Слова могут идти в произвольном порядке.

Реально ли это сделать в виде 1 регулярки?
    


Ответы

Ответ 1



Хочу пояснить и дополнить ответ Qwertiy. Более правильный ответ: ^((20|30|45)\s+гв\b|(?!\bгв\b).)*$ (20|30|45)\s+гв дает совпадение в строках, где за "20", "30" или "45" следует пустое пространство, а затем - "гв" (?!гв). дает совпадение на одном любом символе, если с него не начинается "гв" \b добавлены, чтобы не было ложных негативных срабатываний, например на словах "гвардия" или "агв" (давайте считать, что это слово). Этому выражению удовлетворяет граница слова (\w+), при этом оно не поглащает символ. Когда мы сочетаем их через комбинатор "или", получившаяся регулярка пытается заглотить оба одновременно: если встречается 2, 3 или 4, он идет по первой ветви, иначе - по второй. При этом если встречается "гв", то строка отвергается (negative lookahead). Наконец, поскольку удовлетворяющих выражению подстрок может быть несколько (в частности, вторая ветвь "или" поглощает только один символ), а также строка может быть пустой, все выражение заключается в ^(…)*$.

Ответ 2



Вот: ^((20|30|45) гв|(?!гв).)*$

Ответ 3



Обязательно ли присутствие числа перед "гв"? Если нет, то ищите все вхождения (?\d+)\w+гв в строке - а потом уже вне регулярки проверяйте найденную группу count по списку разрешенных значений. Если число перед "гв" обязательно, используйте регулярку (?\d*)\w+гв.

Комментариев нет:

Отправить комментарий