Объединение двух групп захвата - PullRequest
1 голос
/ 25 марта 2019

У меня есть строка, которую можно разбить на 3 части (Keep1 | Ignore | Keep2). Цель состоит в том, чтобы удалить среднюю подстроку и объединить две другие. Для этого я создал два регулярных выражения: одно для создания группы захвата для Keep1, а другое для Keep2.

Пример текста:

First String.<ref> IGNORE </ref> Second String.

Первое регулярное выражение:

.*(?=<ref>)    

Выход:

First String.

Второе регулярное выражение:

(?<=&lt;\/ref&gt;).*   

Выход:

Second String.   

Желаемый вывод:

First String. Second String.

До сих пор я не мог найти способ объединить обе строки, возможно ли такое на flex?

1 Ответ

1 голос
/ 25 марта 2019

(F) lex не реализует группы захвата, а также не реализует прогнозные утверждения. В общих чертах, он реализует только конструкции, которые соответствуют математическому определению «регулярного выражения», поэтому abd может быть реализован с помощью простого конечного автомата, работающего в линейном времени и постоянном пространстве.

(краткая и полная) документация по синтаксису регулярного выражения содержится в руководстве по Flex .

(«f» в «flex» означает «быстрый», но оригинальное «lex» также было довольно быстро, в основном из-за этого решения о дизайне.)

У вас есть два варианта, в зависимости от точной природы ваших токенов:

  1. Если вы определенно можете распознать токен из первой части, то вы можете использовать условие запуска для распознавания остальной части токена

  2. В противном случае вы можете распознать весь токен в одном регулярном выражении, а затем отсканировать его, чтобы выяснить, какую часть вы хотите сохранить. Вы можете или не сможете выполнить второе сканирование с помощью flex; опять же, вы можете использовать начальное условие, чтобы применить другие правила для повторного сканирования, но это будет зависеть от точного характера вашего шаблона. Вы также можете выполнить повторное сканирование с помощью библиотеки регулярных выражений, либо стандартной библиотеки Posix, либо более гибкой библиотеки, такой как PCRE.

Обратите внимание, что (f) lex также не реализует нежадное повторение, поэтому, если вы хотите реализовать " самую короткую строку, начинающуюся с X и заканчивающуюся Y", вам нужно использовать такую ​​технику, как тот, который показан в (последнем) примере в главе руководства Flex по условиям запуска

...