Регулярное выражение - как найти текст в определенных блоках if? - PullRequest
1 голос
/ 11 сентября 2009

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

/(\/{2}\@debug)(.|\s)*?(\/{2}\@end-debug).*/
var junk = dontWantThis if (junk) {dont want this} if ( **myEnumValue** ) **{ var yes = iWantToFindThis if (true) { var yes2 = iWantThisToo } }**
var junk2 = dontWantThis if (junk) {dont want this}  
var stuff = dontWantThis if (junk) {dont want this} if ( enumValue ) { wantToFindThis }
var stuff = iDontWantThis if (junk) {iDontWantThisEither}

Я знаю, что могу использовать (\{(/?[^\>]+)\}), чтобы найти блоки if, но мне нужен только первый охватывающий блок кода, который следует за значением enum, которое я ищу. Я также заметил, что использование (\{(/?[^\>]+)\}) дает мне первое { и последнее }, оно не группирует последующие {}.

Спасибо!
Тим

Ответы [ 3 ]

6 голосов
/ 11 сентября 2009

Регэкспы просто не могут справиться с такими вещами. Для этого вам понадобится парсер и сканер.

0 голосов
/ 12 сентября 2009

Несмотря на то, что вложение является проблемой, вы можете использовать обратный просмотр и предварительный просмотр для эффективного подсчета подходящих скобок или кавычек. Это не является частью регулярного выражения, но было добавлено во многие библиотеки регулярных выражений, например, в .NET, perl и java; наверное больше. Я бы не советовал вам идти по этому пути, так как вам будет легче его лексически анализировать. Но если вы попробуете это как быстрое решение, соберите несколько тестовых примеров и выполните их через regexbuddy или expresso .

0 голосов
/ 12 сентября 2009

Как намекают другие, это математически невозможно сделать с помощью регулярных выражений (по крайней мере, в целом; вы могли бы заставить его работать, если у вас есть узкоспециализированные случаи). Попробуйте использовать комбинацию lex и awk для получения желаемых результатов, если вы хотите придерживаться стандартных инструментов Unix, или просто перейдите к Perl, Python, Ruby и т. Д. И создайте необходимый лексический анализ.

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