Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

Использование другого разделителя

Чтобы найти строку, которая содержит несколько косых (/), в соответствующем регулярном выражении нужно перед каждой из них поставить обратную косую черту (\). Например, чтобы найти строку, которая начинается с названия директории /usr/etc, нужно записать:

5path = <STDIN>; # прочитать путевое имя (вероятно, из find?) if (5path =~ /"\/usr\/etc/) { # начинается с /usr/etc...

Как видите, комбинация "обратная косая - косая" создает между элементами текста своеобразные "проходы". Если косых очень много, это занятие может стать весьма утомительным, поэтому в Perl предусмотрена возможность использования другого разделителя (delimiter). Поставьте перед любым специальным символом* (выбранным вами в качестве разделителя) букву т, укажите свой образец и дайте еще один такой же разделитель:

/\/usr\/etc/ # использование стандартного разделителя - косой черты m(?/usr/etc(? # использование в качестве разделителя символа (? m#/usr/etc# # использование в качестве разделителя символа # # (это мой любимый символ)

Если хотите, можете опять использовать косые, например, m/fred/. Таким образом, m - общепринятое обозначение операции сопоставления с регулярным выражением, но если в качестве разделителя выбрана косая черта, то m не обязательна.

Использование интерполяции переменных

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

$what = "bird";

5sentence = "Every good bird does fly."; if (Ssentence =~ /\b$what\b/) {

print "The sentence contains the word $what\n";

Здесь мы использовали ссылку на переменную для построения операции сопоставления с регулярным выражением \bbird\b/.

Если этот разделитель - левый элемент пары (круглая, фигурная, угловая или квадратная скобка), то закрывающим разделителем будет соответствующий правый элемент пары В остальных случаях первый и второй разделители будут совпадать.



Вот несколько более сложный пример:

$sentence = "Every good bird does fly."; print "What should I look for? "; $what = <STDIN>; chomp($what) ;

if ($sentence =~ /$what/) { # нашли print "I saw Swhat in Ssentence.\n"; ) else {

print "nope... didnt find it.\n";

Если вы введете слово bird, оно будет найдено, а если слово scream - не будет. Если ввести [bw] ird, результаты поиска тоже будут успешными. Это говорит о том, что квадратные скобки в данном случае воспринимаются как символы сопоставления с образцом.

Чтобы избежать этого, следует поставить перед этими символами обратную косую, которая превратит их в символы буквального сопоставления. Это кажется сложным, если в вашем распоряжении нет закавычивающей управляющей последовательности \q:

$what = " [box]";

foreach (qw(in([box] out[box] white[sox])) ( if (/\Q$what\E/) (

print "$ matched\n";

Здесь конструкция \Q$what\E превращается в \[box\], в результате чего операция сопоставления ищет пару квадратных скобок, а не рассматривает всю конструкцию как класс символов.

Специальные переменные, защищенные от записи

После успешного сопоставления с образцом переменным $1, $2, $3 и т.д. присваиваются те же значения, что и\1, \2, \3 и т.д. Это можно использовать для поиска соответствия в последующем коде. Например:

S = "this IS а test";

/ (\w+)\W+(\w+)/; # сопоставление первых двух слов

# SI теперь содержит this, а S2 - is

Доступ к тем же значениям ($1, $2, $3 и т.д.) можно также получить, использовав операцию сопоставления для соответствующих списков. Если результаты сопоставления окажутся положительными, будет получен список значений от $1 до $п (где п - количество занесенных в память элементов). В противном случае значения не определены. Запишем последний пример по-другому:

S = "this IS а test";

(Sfirst, Ssecond) = /(\w+)\W+(\w+)/; # сопоставление первых двух слов # Sfirst теперь содержит this, а Ssecond - is



к другим предопределенным защищенным от записи переменным относятся: $& (часть строки, совпавшая с регулярным выражением); $~ (часть строки, стоящая перед совпавшей частью); $ (часть строки, стоящая после совпавшей части). Например:

$ = "this is а sample string";

/sa.*le/; # соответствует слову sample внутри строки

# 5" теперь содержит "this is а "

# $& теперь содержит "sample"

# 5 теперь содержит "string"

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

Операция замены

Мы уже говорили о простейшей форме операции замены: з/ регуляр-ное выражение/новая строка/. Пора рассмотреть несколько разновидностей этой операции.

Если вы хотите, чтобы замена выполнялась при всех возможных совпадениях, а не только при первом, добавьте в запись, задающую проведение операции замены, букву д, например:

$ = "foot fool buffoon";

s/foo/bar/g; # $ теперь содержит "bart barl bufbarn"

В заменяющей строке производится интерполяция переменных, что позволяет задавать эту строку во время выполнения:

$ = "hello, world"; 5new = "goodbye";

s/hello/5new/; # заменяет hello на goodbye

Символы сопоставления (метасимволы) в регулярном выражении позволяют выполнять сопоставление с образцом, а не просто с символами, трактуемыми буквально:

$ = "this is а test";

s/(\w+})/<51>/д; # 5 теперь содержит "<this> <is> <a> <test>"

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

Суффикс i (перед буквой g или после нее, если она есть) заставляет используемое в операции замены регулярное выражение игнорировать регистр, как и аналогичная опция в ранее рассмотренной нами операции сопоставления.

о влиянии этих переменных на производительность рассказывается в книге Mastering Regular Expressions (издательство OReilly).



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103