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


Возвраты и сохраненные состояния - часть 4


и строку

123

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

в шаблоне 1.3 в строке 1.23

где точкой обозначена текущая позиция поиска. Подшаблон 2? совпадет с 2, а 3 совпадет с символом 3. Совпадение будет найдено с первой попытки, и сохраненное состояние не вступит в игру, а если бы и вступило, то не привело бы к успеху поиска.

Теперь рассмотрим работу этого шаблона на строке

13

Вначале литерал 1 совпадет с символом 1 в строке. Далее 2? с максимальным значением квантификатора, а это просто 2, не совпадет с символом 3. Но перед этим создается сохраненное состояние:

в шаблоне 1.3 в строке 1.3

При этой локальной неудаче произойдет возврат к последнему сохраненному состоянию, который приведет к совпадению литерала 3 с символом 3, и поиск закончится удачно.

Вы можете распечатывать отладочную информацию и наблюдать процесс возвратов и итераций. Для этого надо вставить внутрь регулярного выражения код Perl, который будет распечатывать текущую позицию в тексте всегда, когда этот код будет попадаться при продвижении текущей позиции по регулярному выражению слева направо. О вставке кода и функции pos, возвращающей текущую позицию поиска, мы поговорим в дальнейших лекциях, а сейчас рассмотрим пример из главы 3, но в свободном форматировании с модификатором x, о котором речь пойдет также в начале этой главы:

#!/usr/bin/perl -w use strict; use re 'eval';

$_='abcd'; m!(?{ print "Starting from ".pos($_)."\n" }) (\w (?{ print pos($_)."\n$1\n" }) )*!x;

Если убрать код Perl, то оператор поиска будет выглядеть так:

m!(\w)*!x;

На печать выведется следующее:

Starting from 0 1 Use of uninitialized value in concatenation (.) or string at (re_eval 2) line 1.

2 a 3 b 4 c

Конструкция

(?{ код Perl })

вставляет код Perl в шаблон. Иногда при вставке кода в регулярное выражение транслятор выдает ошибку

Eval-group not allowed at runtime, use re 'eval' in regex m/…




Начало  Назад  Вперед



Книжный магазин