Мне кажется, что синтаксический анализатор регулярных выражений удаляет строку совпадения, как только найдено первое действительное совпадение.У меня сейчас нет настройки компилятора Windows, поэтому я не могу дать сравнение яблок с яблоками, но я вижу похожие результаты в perl.
Я думаю, что ваше регулярное выражение будет выглядеть примерно так после объединения.
'\ b (красная рубашка | синий | зеленый | красный) \ b'
Тестирование этого регулярного выражения показывает тот же результат, что и "красная рубашка", "синий".Перемещая «красную рубашку» в конец списка регулярных выражений.
'\ b (красный | синий | зеленый | красная рубашка) \ b'
Теперь я вижу «красный», «синий ".
Изменив регулярное выражение на более сложный подход, вы сможете достичь желаемых результатов.
\ b (синяя | зеленая | (красная) рубашка) \ b
Это должно совпадать с красным как его собственной подгруппой и красной рубашкой как с группой.
Возвращает "красную рубашку", "красный", "синий"
Более простой способ сделать это - циклически проходить по списку строк и совпадать с 1, если у вас будет много групп слов, для которых понадобится несколько совпадений, таких как красная и красная рубашка.
Так какЕсть так много способов сделать регулярное выражение, я, вероятно, упускаю очевидное и элегантное решение.