Написать письмо   
 
logo
 
Snippy
Сборник
примеров кода
Это не то, что можно сделать одним регулярным выражением, каким бы оно ни было сложным. Для поиска чего-то между двумя символами шаблон вроде /x([^x]*)x/ даст в $1 промежуточную подстроку. Для различных ограничителей нужно что-то вроде /alpha(.*?)omega/. Но ни один из этих шаблонов не работает со вложенностью. Для сбалансированных выражений с разделителями (, {, [ или < используйте модуль Regexp::Common из CPAN. В остальных случаях придется писать парсер.

Если вы действительно хотите написать парсер, то есть ряд модулей и странных штук, которые сильно упростят вам жизнь. В CPAN есть Parse::RecDescent, Parse::Yapp и Text::Balanced; также имеется программа byacc. Начиная с Perl 5.8, в стандартную поставку входит Text::Balanced.

Простой подход с разрушением строки изнутри, который стоит попробовать — последовательная выборка компонентов с наибольшей вложенностью:
while (s/BEGIN((?:(?!BEGIN)(?!END).)*)END//gs) { # сделать что-то с $1 }

Более хитрый подход — переложить эту работу на движок регулярных выражений Perl. Вот код, который скорее годится на Конкурс запутанных исходников, но он действительно работает:




Ваше имя
Ваш E-mail
(если хотите отслеживать комментарии)
Дoкажи, что ты не робот
Текст комментария