Читаем Язык программирования Perl полностью

m/ # начало регулярного выражения ]+? # далее могут быть любые символы, кроме > HREF # определение гиперссылки \s*=\s* # знак =, возможно окруженный пробелами ["']? # может быть открывающая кавычка или апостроф ( # начало захвата значения [^'" >]+? # адрес ссылки: все, кроме ',",пробела и > ) # конец захвата значения ['"]? # может быть закрывающая кавычка или апостроф \s* # за которым могут быть пробелы > # конец тега /igx; # конец регулярного выражения # соответствует, например:

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

Кроме поиска, регулярные выражения часто применяются для замены найденных совпадений на новые значения. Для этого существует операция замены (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://' из ссылок

Перейти на страницу:

Похожие книги