Регулярные выражения Perl и их применение


         

Встроенный код и поиск вложенных конструкций - часть 2


При этих данных наша программа выводит Match, но если нарушить баланс скобок, то будет выведено Not match.

В этом примере скобки представлялись одним символом, но они могут быть и многосимвольными. Например, мы проверяем правильность вложенности тегов table. В этом случае подшаблон (?> [^()]+ ) нужно заменить на другую конструкцию, т.к. многосимвольные скобки нельзя втиснуть в класс символов. Вместо этого подшаблона используется такая конструкция:

(?> (?: (?! <table|</table ) .)+ )

Эта конструкция проверяет, находится ли в текущей позиции фрагмент <table или </table, и если нет ни того, ни другого фрагмента, то она поглощает один символ с помощью точки.

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

$_=<<EOF; <Table> <tr><td> <Table> <tr><td> </td></tr> </TABLE> </td></tr> </TABLE> EOF

my $ctop=0; if (m% ^ (?> (?: (?> (?: (?! <table|</table ) .)+ ) | <table (?{ ++$ctop }) | </table (?(?{ $ctop }) (?{ --$ctop }) | (?!) ) )* ) (?(?{ $ctop }) (?!) ) $ %isx ) { print 'Match' } else { print 'Not match' }

С данными в переменной $_ будет напечатано Match.




Содержание  Назад  Вперед