Лекция 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.