задача регулярного выражения в граничном слове (перекрытие) - PullRequest
1 голос
/ 22 октября 2010

Учитывая следующий код:

var myList = new List<string> { "red shirt", "blue", "green", "red" };
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
MatchCollection m = r.Matches("Alfred has a red shirt and blue tie");

Я хочу, чтобы результат m включал "red shirt", "blue", "red", поскольку все они есть в строке, но я получаю только "red shirt", "blue".Что я могу сделать, чтобы включить перекрытия?

1 Ответ

1 голос
/ 22 октября 2010

Мне кажется, что синтаксический анализатор регулярных выражений удаляет строку совпадения, как только найдено первое действительное совпадение.У меня сейчас нет настройки компилятора Windows, поэтому я не могу дать сравнение яблок с яблоками, но я вижу похожие результаты в perl.

Я думаю, что ваше регулярное выражение будет выглядеть примерно так после объединения.

'\ b (красная рубашка | синий | зеленый | красный) \ b'

Тестирование этого регулярного выражения показывает тот же результат, что и "красная рубашка", "синий".Перемещая «красную рубашку» в конец списка регулярных выражений.

'\ b (красный | синий | зеленый | красная рубашка) \ b'

Теперь я вижу «красный», «синий ".

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

\ b (синяя | зеленая | (красная) рубашка) \ b

Это должно совпадать с красным как его собственной подгруппой и красной рубашкой как с группой.

Возвращает "красную рубашку", "красный", "синий"

Более простой способ сделать это - циклически проходить по списку строк и совпадать с 1, если у вас будет много групп слов, для которых понадобится несколько совпадений, таких как красная и красная рубашка.

Так какЕсть так много способов сделать регулярное выражение, я, вероятно, упускаю очевидное и элегантное решение.

...