Опубликован: 18.06.2007 | Доступ: свободный | Студентов: 1354 / 35 | Оценка: 4.14 / 3.29 | Длительность: 12:44:00
ISBN: 978-5-94774-604-4
Лекция 3:

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

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Аннотация: Изучение дополнительных конструкций в регулярных выражениях. В первых двух лекциях мы уже встречались с некоторыми конструкциями, о которых пойдет речь. Здесь мы рассмотрим их более систематически

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

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

В первом, более простом варианте, вы можете использовать специальные скобки

(?# комментарий ).

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

print "bb" =~ /^b(?#aaaaa){2}$/;

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

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

print "bb" =~ m#^b(?#aaaaa){2}$#;

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

Sequence (? incomplete in regex; …

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

print "bb" =~ m#^b(?\#aaaaa){2}$#;

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

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

m( регулярное выражение )

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

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

print "bb" =~ 
/^          # Это начало строки
  b         # Далее идет символ b
   {2}      # За ним следует квантификатор
      $     # И в конце - конец строки
/x;

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

\x20 для пробела
\t для табуляции и т.д.

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

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Константин Бражников
Константин Бражников
Россия
Mike .
Mike .
Россия