Регулярное выражение для сопоставления строк, которые НЕ содержат всех указанных элементов

#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:

Используйте этот шаблон:

(?!.*two.*three|.*three.*two)^.*$

Смотрите демонстрацию

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

1. Оно не соответствует two four

2. Спасибо, я принял ответ @JvdV, потому что он может быть применен к более чем 2 словам