#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+гв.
Комментариев нет:
Отправить комментарий