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

Практическое использование операторов m// и s///

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

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

Для привязки к началу текста можно использовать якорь \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, но поиск будет медленнее из-за увеличивающегося числа проверок.

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