#regex #regex-lookarounds #regex-negation
#регулярное выражение #regex-поисковые запросы #регулярное выражение-отрицание
Вопрос:
Я хотел бы найти регулярное выражение, которое соответствует строкам, которые НЕ содержат всех указанных элементов, независимо от их порядка. Например, учитывая следующие данные:
one two three four
one three two
one two
one three
four
Передача слов two three
в регулярное выражение должна соответствовать строкам one two
, one three
и four
.
Я знаю, как реализовать выражение, которое соответствует строкам, которые не содержат НИ ОДНОГО слова, сопоставляя только строку four
:
^((?!two|three).)*$
Но для случая, который я описываю, я заблудился.
Комментарии:
1. @JvdV он не может содержать оба слова одновременно, только одно из них, все в порядке
2.Кроме того,
^(?!.*b(two|three)b.*b(?!1)(two|three)b).*
должно работать. Расширение для трех слов будет выглядеть следующим образом.
Ответ №1:
Хороший вопрос. Похоже, вы ищете какую AND
-то логику. Я уверен, что кто-то может придумать что-то лучше, но я подумал о двух способах:
^(?=(?!.*btwob)|(?!.*bthreeb)).*$
Смотрите онлайн-демонстрацию
Или:
^(?=.*btwob)(?=.*bthreeb)(*SKIP)(*F)|^.*$
Смотрите онлайн-демонстрацию
В обоих случаях мы используем положительный прогноз для имитации AND
логики, чтобы предотвратить присутствие обоих слов в тексте независимо от их положения в полной строке. Если присутствует только одно из этих слов, строка будет передана.
Ответ №2:
Комментарии:
1. Оно не соответствует
two four
2. Спасибо, я принял ответ @JvdV, потому что он может быть применен к более чем 2 словам