Регулярное выражение: соответствует хотя бы * два * из данного списка строк или шаблонов? - PullRequest
0 голосов
/ 17 июня 2019

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

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent)

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

(не: один и тот же цвет более одного раза, но на самом деле два разных цвета, т.е. два разных совпадения из списка образцов)

Я могу придумать хитрость для достижения этой цели, например: найти первое совпадение, удалить все экземпляры этого совпадения (то есть найти / заменить его пустой строкой или чем-то еще), а затем снова выполнить проверку регулярных выражений.Если это снова совпадает, я знаю, что есть второй цвет.

Но есть ли более изощренный способ сделать это, предпочтительно «только регулярное выражение»?

1 Ответ

1 голос
/ 17 июня 2019

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

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent).*(?!\1)(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent)

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

Или, если ваш движок может восстановить предыдущую группу, можно написать более СУХОЙ:

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent).*(?!\1)(?1)

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

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent).*(?!\1)((?1)).*(?!\1|\2)(?1)

https://regex101.com/r/ubR2HF/2

...