Регулярное выражение для совпадения блоков кода несколько раз - PullRequest
3 голосов
/ 08 декабря 2008

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

//@debug
...
// code in here
...
//@end-debug (possibly more comments here on same line)

Каждый блок кода, который я пытаюсь найти, начинается с //@debug и заканчивается в конце строки, содержащей //@end-debug

У меня есть это на данный момент:

/(\/{2}\@debug)(.|\s)*(\/{2}\@end-debug).*/

Но это соответствует одному большому блоку от первого //@debug до конца строки самого последнего //@end-debug в файле.

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 08 декабря 2008

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

/ (/ {2} \ @ отладки) (|. \ S?). * (/ {2} \ @ конец отладки) * /

1 голос
/ 08 декабря 2008

Вам также не нужно использовать этот хак (.|\s), но синтаксис для его правильного выполнения зависит от языка или инструмента, который вы используете. В Perl или Javascript вы можете сделать это:

/\/\/@debug.*?^\/\/@end-debug[^\r\n]*/sg

Модификатор /s позволяет точкам сопоставлять возврат каретки и перевод строки, в результате чего получается регулярное выражение, которое легче читать и более эффективно. Это также означает, что мне пришлось изменить второе .* на [^\r\n]*, но оно того стоит. Модификатор /g - это то, что позволяет регулярному выражению совпадать несколько раз (т. Е. «Глобально»).

0 голосов
/ 08 декабря 2008

на каком языке? Регулярные выражения Python (я думаю, они == для регулярных выражений perl5) имеют понятие "жадные" против "не жадных" регулярных выражений, вы можете управлять им через флаг где-нибудь.

поиск "жадный против не жадных" на эта страница , также эта страница может быть лучше

Нежадные квантификаторы имеют одинаковые синтаксис как обычные жадные, кроме с квантификатором, за которым следует вопросительный знак. Например, не жадный шаблон может выглядеть так: "/ А [A-Z] *? В /". На английском это означает "соответствует A, за которым следует только столько заглавные буквы, необходимые для поиска А Б. "

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