Страницы

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

воскресенье, 7 апреля 2019 г.

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

Возможно ли в рамках одной регулярки реализовать следующее:
Есть строка в которую пользователь может вводить все что угодно, но есть одно НО!
Есть перечень слов, которые должны употребляться только с определенной цифрой:
20 гв 30 гв 45 гв
Т.е если юзер ввел строчку: 123 qwe 20 гв. Все ок. Совпадение есть
Если юзер вбил 100500 гв 123 qwe, то совпадений нет, так сочетание 100500 гв отсутствует в списке. Слова могут идти в произвольном порядке.
Реально ли это сделать в виде 1 регулярки?


Ответ

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

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

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