универсальное регулярное выражение для захвата различных необязательных групп - PullRequest
0 голосов
/ 01 июля 2018

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

^(?:.*?(aaa).*?|.*?)(xxx).*?(yyy)(?:.*?([^ \n]+).*?|.*?)$

Итак, общий термин для необязательных групп:

(?:.*?(blabla).*?|.*?)

Вышеуказанный подход имеет проблемы с возвратом в случае:

  • большие тексты;
  • когда ничто не совпадает;
  • при наличии только необязательных групп.

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

1 Ответ

0 голосов
/ 02 июля 2018

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

^(?:(?!bla).)*(bla)?(?:(?!bla).)*$

Демо

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

(?:(?!bla|blub).)*(bla|blub)?(?:(?!bla|blub).)*

Демонстрация (Примечание: начальный / конечный якорь были удалены)

Этот учебник rexegg.com объясняет почти все, что касается жадного токена, и показывает возможные варианты.

Пример кода

...