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

       

Применение якорей, проверки текста до и после шаблона


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

Вот как можно проверить, что текст не начинается с точки:

if ($text =~ /^\./) { print "Текст не должен начинаться с точки!" }

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

$_=<<EOF; Первая строка. Вторая строка. Третья строка. EOF

s/^/ /gm;

Без модификатора m пробел будет вставлен лишь в начало первой строки.

Пустые строки удаляются оператором замены с таким регулярным выражением:

$_=<<EOF; Первая строка.

Вторая строка. Третья строка. EOF

s/^\n//gm; print $_;

Получаем на выходе:

Первая строка. Вторая строка. Третья строка.

Может показаться, что оператор s/^$//gm тоже должен удалить пустые строки, но он не сделает замены. Удалиться должен реальный символ, а не совпадение с началом и концом строки, поэтому сперва он должен быть найден. А что-то вставить в пустую строку таким оператором s вполне возможно.

При преобразовании текста в HTML нужно заменять символы & на &amp; Это делается просто:

s/&/&amp;/g

ведь амперсанд не является метасимволом в регулярных выражениях.

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

$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789. EOF

/.*(\d+)/s; print $1;

На печать выходит лишь цифра девять: 9. Удивлены? Квантификатор вернул несколько символов, и текущая позиция в тексте оказалась на цифре 9. Этого достаточно для совпадения шаблона \d+. Чтобы получить правильный результат, надо потребовать, чтобы перед подшаблоном \d+ не было цифры:

$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789. EOF

/.*(?<!\d)(\d+)/s; print $1;

Печатает 789.

Чтобы привязать шаблон к концу текста, можно воспользоваться якорями \z (для привязки к истинному концу текста) или \Z ($ без модификатора m):

$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789 EOF

/(\d+)$/; print $1;

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

$_=<<EOF; Первая строка 123. Вторая строка 456. Третья строка 789. EOF

/(\d+)\D*$/; print $1;

Опять получаем 789, но поиск будет медленнее из-за увеличивающегося числа проверок.



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