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

ba2f5a3f

Привязка к началу и концу строк и текста


Мнимые символы \A, \Z и \z не зависят от установок модификаторов и работают всегда одинаково. Не таковы якоря ^ и $, работа которых зависит от модификатора m. В зоне, где модификатор m отключен, якорь ^ соответствует якорю \A, а якорь $ - якорю \Z. Рассмотрим такой пример:

$_="a\r\n"; print '1' if m'a\r$\n';

Здесь я использовал в качестве ограничителей регулярного выражения апострофы, чтобы не было попытки интерполяции специальной переменной $\. Метасимвол $ стоит перед символом \n, который является последним в тексте, и на печать выйдет единица.

Если переставить символ $ перед символом \r:

$_="a\r\n"; print '1' if m'a$\r\n';

то поиск закончится неудачей, потому что здесь $ не стоит непосредственно перед символом \n.

Теперь вернемся к первому примеру и добавим в конце текста какой-нибудь символ:

$_="a\r\nb"; print '1' if m'a\r$\n';

В этом случае поиск вновь завершится неудачно, потому что символ \n здесь уже не последний в тексте. Но если поставить модификатор m, то поиск закончится удачей:

$_="a\r\nb"; print '1' if m'a\r$\n'm;

Теперь такой пример:

$_="a\n"; print '1' if /'a\n^/m;

Единица напечатана не будет, потому что якорь ^ не совпадает после символа \n, если он стоит последним в тексте, и модификатор m здесь не поможет. Но если после \n поставить еще символ:

$_="a\n\n"; print '1' if m'a\n^'m;

то совпадение будет найдено. Теперь в последнем примере уберем модификатор m:

$_="a\n\n"; print '1' if /a\n^/;

Совпадения шаблона тексту уже не будет, т.к. без модификатора m якорь ^ совпадает только в начале текста.



Содержание раздела