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

Построение эффективных регулярных выражений. Оператор qr/…/ и объекты регулярных выражений.

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >

10.1.2. Оператор qr/…/ и модификаторы

Объект регулярного выражения компилируется вместе со своими модификаторами, эти режимы поиска "вшиваются" в откомпилированное регулярное выражение, и их нельзя потом изменить. Пример:

$_='aB';
my $re=qr/[a-z]+/;
print $& if /$re/;

Идет поиск с учетом регистра символов, на печать выводится a. Модификаторы, находящиеся снаружи объекта регулярного выражения, не могут повлиять на его работу:

print $& if /$re/i;

print $& if /(?i)$re/;

print $& if /(?i:$re)/i;

Все равно выводится только буква a. Модификатор должен стоять в самом операторе, который возвращает объект регулярного выражения:

$_='aB';
my $re=qr/[a-z]+/i;
print $& if /$re/;

Теперь печатается aB.

Верно и обратное: режимы поиска, которые были установлены внутри объекта регулярного выражения, не влияют на остальную часть регулярного выражения, в которое входит этот объект. Пример:

$_='aB';
my $re=qr/(?i)[a-z]+/;
print $& if /${re}b/;

Ничего не напечатается, т.к. режим поиска без учета регистра (?i) не действует вне объекта регулярного выражения $re. Здесь фигурные скобки, окружающие имя переменной, отделяют ее от последующих букв так же, как и в случае с интерполяцией переменных. Следующий пример:

$_='aB';
my $re=qr/(?i)[a-z]+/;
print $& if /${re}B/;

напечатает aB.

10.1.3. Объекты регулярных выражений и квантификаторы

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

$_='abab';
my $re=qr/ab/;
print $& if /$re+/;

Напечатается abab. В случае с интерполяцией текста в регулярное выражение:

$_='abab';
my $re='ab';
print $& if /$re+/;

напечатается только ab, т.е. плюс относится лишь к последнему символу b.

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Константин Бражников
Константин Бражников
Россия
Mike .
Mike .
Россия