Regex для сопоставления всех строк, содержащих два разных слова из списка - PullRequest
0 голосов
/ 11 февраля 2019

Мне нужно регулярное выражение (в Java), которое соответствует строке, если и только если она содержит два различных слова из данного списка.

Например, если списокслов {синий, желтый, розовый}, тогда строки «синий и розовый» и «желтый - новый синий» будут совпадать, а строки «мне нравится синий» - нет (появляется только одно слово из списка) ии не будет строки «Моя розовая рубашка очень розовая» (она не содержит двух или более разных слов, но дважды содержит одно и то же слово).

Самое близкое, что я мог найти к желаемому регулярному выражению:

(.<em>(blue|yellow|pink).</em>){2}

Это регулярное выражение будет соответствовать любой строке, которая содержит два или более слов из списка, но это будет так, даже если эти два слова совпадают (как в «Моя розовая рубашка»Это очень розовый пример).

Спасибо !!

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Вы могли бы сделать это с двумя взглядами

^(?=.*blue)(?=.*pink).+$

Но вам нужно будет указать слова программно до этого.См. демонстрацию на regex101.com .

0 голосов
/ 11 февраля 2019

Вы можете использовать положительный прогноз и группу захвата с привязкой, чтобы утверждать начало и конец строки, и использовать группу захвата с обратной ссылкой, чтобы утверждать, что справа не то, что уже захвачено:

^(?=.*(blue|yellow|pink).*(?!\1)(blue|yellow|pink)).*$

Демонстрация по regex101

0 голосов
/ 11 февраля 2019

После захвата начального слова, повторяйте символы и отрицательный прогноз для первой группы захвата прямо перед соответствием чередования второго цветового слова:

.*(blue|yellow|pink).*(?!\1)(blue|yellow|pink).*

https://regex101.com/r/OPo2bf/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...