≪
≫

Лекция 3. Дополнительные конструкции в регулярных выражениях

В лекции проводится изучение дополнительных конструкции в регулярных выражениях.

Ключевые слова: perl, шаблон, подшаблон, класс символов, диапазон символов, метасимвол, эскейп-последовательность, обратная ссылка, альтернативный шаблон, квантификатор, минимальный квантификатор, числитель, повторитель, мнимый символ, якорь, модификатор, захватывающие скобки, незахватывающие скобки, сохраняющие скобки, нумерованная переменная, регулярное выражение, атомарная группировка.

В первых двух лекциях мы уже встречались с некоторыми конструкциями. о которых пойдет речь. Здесь мы рассмотрим их более систематически.

Комментарии в регулярных выражениях

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

В первом, более простом варианте, вы можете использовать специальные скобки (?# комментарий ).

Эта конструкция игнорируется. Комментарий не может содержать закрывающую круглую скобку, т.к. по ее наличию определяется, где заканчивается конструкция комментария. Сам комментарий может отсутствовать: закрывающая скобка может стоять сразу за решеткой. Конструкция комментария может даже стоять между подшаблоном и его квантификатором: оператор

print "bb” /,'Ь(?дааааа){2}$/;

напечатает единицу. Но это еще не значит, что конструкция комментария может стоять абсолютно в любом месте регулярного выражения. Обычно ее используют между подшаблонами, и этого бывает достаточно.

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

print "bb” =~ m#''b(?#aaaaa){2}$#:

Возникнет сообщение

Sequence (? incomplete in regex;

Дело в том, что Perl определяет, где заканчивается регулярное выражение. по символу, который соответствует ограничителю, стоящему перед этим выражением. И если внутри регулярного выражения этот символ присутствует в явном виде (а. скажем, не как эскейп-последовательносгь х23), то он должен быть замаскирован обратной косой чертой;

print “bb” =~ пш''Ь(?#ааааа){2}$#;

Здесь уже все в порядке.

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

т( регулярное выражение }

и хотим в этом выражении применять скобочные конструкции. Тогда нам придется маскировать обратным слэшем все круглые скобки! А как в шаблоне записать литерал, состоящий из такой скобки? Похоже, что в явном виде вообще никак. Поэтому, если внутри шаблона встречается косая черта /, то в качестве ограничителей лучше выбирать восклицательный знак, решетку; двоеточие, запятую, знак процента или аналогичный символ, который отсутствует в шаблоне. Если вы, конечно, не участвуете в конкурсе на самую непонятную программу на Perl.

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

print «ЬЬ» =~ Г

и

Это начало строки

ь

И

Далее идет символ b

12}

it

За ним следует квантификатор

$

#

И в конце - конец строки

/х;

И этот пример работает. Как видим, мы включили не только комментарии, но и пробелы для красивых отступов вне комментариев! Да. в пределах действия квантификатора х все пробельные символы (а не только пробелы) игнорируются. Ведь комментарии надо для наглядности чем-то отделять от кода. Но теперь в регулярное выражение нельзя вставить эти самые пробельные символы в явном виде, ведь они не будут работать. Придется воспользоваться эскейп-последовательностями

х20 для пробела

для табуляции и т.д.

Или же в общем виде: s.

 
Посмотреть оригинал