Опубликован: 17.08.2006 | Уровень: для всех | Доступ: платный
Лекция 8:

Регулярные выражения

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >

Замена строк

Кроме поиска, регулярные выражения часто применяются для замены найденных совпадений на новые значения. Для этого существует операция замены (substitution), которая пытается найти в строковой переменной соответствие образцу, а если находит, то заменяет найденную подстроку на указанное значение. Операция замены выглядит так:

$variable =~ s/образец/замена/;
# в переменной $variable отыскивается строка 'образец',
# и если найдена, то она заменяется на 'замена'

Все, что говорилось до этого про операцию сопоставления, применимо для левой части операции замены, в которой указывается образец поиска. Левая и правая части операции замены интерполируются, поэтому там могут использоваться escape-последовательности и переменные.

$pattern = 'шило';     # образец
$replacement = 'мыло'; # замена
$text =~ s/$pattern/$replacement/; # поменять 'шило' на 'мыло'

В правой части операции замены могут использоваться обратные ссылки на найденные значения. Так, например, можно поменять местами два крайних слова в тройке слов, разделенных пробельными символами:

$text = 'мать  любит  дочь'; 
$text =~ s/(\S+)\s+(\S+)\s+(\S+)/\3 \2 \1/; 
# в $text будет 'дочь любит мать'

Для операции замены s/// можно применять все модификаторы, упомянутые для операции сопоставления m//. Например, модификатор /g указывает, что должны быть заменены все найденные в тексте соответствия. Например:

$our_computers =~ s/Windows/Linux/g;

У операции замены есть дополнительный модификатор /e (expression evaluation), при включении которого заменяющая часть вычисляется как выражение. При этом в заменяющей части можно использовать ссылки на захваченные при помощи круглых скобок соответствия. Это можно применять для более "интеллектуальной" замены найденных соответствий. Так, например, можно перевести температуру из шкалы Цельсия в шкалу Фаренгейта:

$text = 'Бумага воспламеняется при 233C.';
$text =~ s/(\d+\.?\d*)C\b/int($1*1.8+32).'F'/e;
# в $text будет: 'Бумага воспламеняется при 451F.'

Применение регулярных выражений

Регулярные выражения применяются во многих конструкциях. В функции split() первым параметром может использоваться регулярное выражение, которое будет служить для поиска разделителей при разделении строки на части. Так, например, можно разбить строку на подстроки по любому из пробельных символов:

@substrings = split /\s+/, $text; # разбить на части

Регулярные выражения часто применяются в функциях, работающих с массивами для фильтрации нужных элементов. Например, функция grep() возвратит список элементов массива, соответствующих указанному образцу:

@result = grep /$pattern/, @source; # отобрать элементы

С помощью функции map можно применить операцию замены в соответствии с регулярным выражением ко всем элементам массива, например:

@hrefs = ('http://regex.info', 'http://regexp.ru');
map s{http://}{}, @hrefs; # убрать 'http://' из ссылок

Регулярные выражения дают программисту новый взгляд на текстовые данные: вместо отдельных символов и простых подстрок он начинает мыслить обобщенными шаблонами, что помогает ему находить более простые и эффективные решения. В таблице 8.1 для справки приведены основные обозначения, применяемые для записи регулярных выражений в Perl. Дополнительные сведения о регулярных выражениях можно почерпнуть из стандартной документации по Perl и перевода уникальной книги Джеффри Фридла "Регулярные выражения".

Таблица 8.1. Основные обозначения для записи регулярных выражений
Обозначение Описание Примеры
// ограничители регулярного выражения по умолчанию /$pattern/
\ отмена специального значения следующего символа m{C:\\windows}
() группировка шаблонов или сохранение значения /(\w\w\w)+/
| выбор из нескольких альтернатив /кошелек|жизнь/
[] класс символов: любой символ из перечисленных /[0-9a-fA-F]/
[^] инвертированный класс символов: любой символ, кроме перечисленных /[^0-9]/
Метасимволы
. любой символ, кроме \n (соответствует любому символу, включая \n с модификатором /s) /(.+)/
\d десятичная цифра m{Время=\d+ сек}
\D не десятичная цифра /(\D*)\d+/
\w алфавитно-цифровой знак /\s+\w+\s+/
\W не алфавитно-цифровой знак /\W\W\W/
\s пробельный символ s/\s+/ /
\S любой символ, кроме пробельного /\S+/
Утверждения
^ начало строки (соответствует началу каждой строки с модификатором /m) /^\w+/
$ конец строки (соответствует концу каждой строки с модификатором /m) /\d+$/
\b граница слова (между \w и \W или \W и \w) /stop\b/
\B любая позиция, кроме границы слова /stop\B/
\A только начало строки, даже с модификатором /m /\A[#]/
\z только конец строки, даже с модификатором /m /\w+\z/
\Z только конец строки или перед \n в конце строки, даже с модификатором /m /\w+\Z/
\G позиция в строке, равная значению функции pos()
Escape-последовательности
\t \n \r \f \a \b управляющие символы: \b в классе символов выступает как символ Backspace (0x08), вне его - как граница слова /[\a\b\f\r\n\t]/
\0 \x \c \N коды символов /\033\x1F\cZ/ /\x{263a}/
\l \L \u \U \Q \E преобразующие последовательности /\Q$pattern\E/
Квантификаторы
* *? любое число повторений, включая 0 (максимальный и минимальный квантификаторы) /\s*/ /\S*?/
+ +? одно и более повторений (максимальный и минимальный квантификаторы) /\d+/ /\D+?/
? ?? ноль или одно повторение (максимальный и минимальный квантификаторы) /.?/ /[.a-z]??/
{n} {n}? ровно n повторений (максимальный и минимальный квантификаторы) /\w{8}/ /\w{5}?/
{n,} {n,}? n и более повторений (максимальный и минимальный квантификаторы) /\d{2,}/ /\d{5,}?/
{n,m} {n,m}? от n до m повторений включительно (максимальный и минимальный квантификаторы) /[A-Z]{1,12}/ /[a-z]{0,3}?/

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

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам

 

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет