как выбрать внутренние совпадения в lex - PullRequest
0 голосов
/ 30 апреля 2009

я новичок в lex, и я хочу взять все совпадения, связанные с регулярным выражением

например, в следующем тексте:

/* text text

text 
text

text */

text text
/* text text text text text text

text text */

Я хочу выбрать два матча между / * и * /

но lex соответствует всему внешнему совпадению и не возвращает их! Я использую это выражение:

\/\*(.|\n)*\*\/

Как выбрать внутренние совпадения вместо всего внешнего? спасибо

1 Ответ

1 голос
/ 30 апреля 2009
\/\*([^*]|\n|\*+[^*/])*\*+\/

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

  • персонаж, который не *
  • перевод строки
  • строка * s, за которой следует символ, который не является /

В конце есть строка * s, за которой следует /. (Примечание: в предыдущей версии этот случай не обрабатывался правильно. Мне бы очень хотелось, чтобы в flex был оператор *?).

...