Анимация
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

Непечатные символы

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

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

Таблица 6.1. Специальнье си

Символ

Значение

Перевод строки Возврат каретки Табулятор Прогон страницы

Квантификаторы

Пока мы лишь рассматривали случай, когда символу шаблона соответствует один символ в строке. Например, в шаблоне /Simon/ символ S соответствует S, i соответствует (, ш соответствует т и т.д. Квантификаторы - это метасимволы, используемые для указания количественных отношений между символами в шаблоне и в искомой строке. Квантификатор может быть поставлен после одиночного символа или после группы символов (о группах мы скоро поговорим).

Простейшим квантификатором является метасимвол +. Он означает, что идущий перед ним символ соответствует нескольким идущим подряд таким символам в строке поиска. Количество символов может быть любым (максимально большим в рамках соответствия шаблону), но должен присутствовать хотя бы один символ. Таким образом, шаблону /do+g/ будут:

соответствовать

weсоответствnnатЬ

Hounddog hotdog

doogie howser

badge (нет буквы о)

doof us (отсутствует буква g)

Doogi- это не d)

pagoda (буквы и g идут но порядку)

Действие метасимвола * схоже с действием +. Метасимвол * указывает, что идущий перед ним символ встречается нуль или более раз. Другими словами, шаблон /t*/ будет искать подряд идушие буквы Г, но если таких букв вообше нет, поиск все равно будет считаться успешным, т.е. регулярному выражению /car*t/ будут:.

I. HQEi Perl



соопвепспвовапь

не соответствовать

carted

carrot (лишняя буква о)

carl (буква t в данном шаблоне - обязательная)

carrrt

caart (лишняя а не подходит)

более ограниченный диапазон действия у метасимвола ?. Предшествующий

ему символ должен встречаться нуль или один раз (но не более того). Так, шаблон /с?о1а/ означает, что буква с может встретиться один раз или вообще не встретиться. Этот шаблон соответствует любой строке, содержащей символы ola, например cola.

Различие между метасимволами ? и * состоит в том, что, например, щаблону /с?о1а/ соответствуют и ola, и cola, но не ccala. Дополнительная буква с не входит в зону совпадения. Шаблону /c*ola/ будут соответствовать и cola, и ola, и ccola, потому что, в отличие от предыдущего шаблона, для совпадения допускается неограниченное количество подряд идущих букв с.

Если возможностей метасимволов +, *, ? вам недостаточно, воспользуйтесь фигурными скобками {} для точного указания количества повторений:

раЬ{п,ш}

Здесь л - минимально допустимое количество повторений, - максимально допустимое количество повторений, a pat - символ или группа символов, для которых указывается количество повторений. Один из параметров л или можно опустить, но

не оба сразу! Посмотрите на примеры:

/х{5,10}/ i х встречается ка ганиун 5 раз, но не более 10

/х{9, }/ X встречается 9 или более раз

/х{0, 4}/ i X встречается не более 4 раз, но может

• вообще не встретиться /х{8}/ ♦ х встречается ровно 8 раз

В регулярн1х выражениях часто используют идиому Ей соответствует все, что угодно, например в шаблона rst. *last/ - это любые символы, находящиеся между двумя словами. Согласно приведенному шаблону, Perl пытается найти слово first,. текст за ним и слово last. Посмотрите действие шаблона на примере следующих строк:

then last

The good players get picked first., the had last

The .first shall ,hp,..1fls1--anrl-the-last shall be first.

Внимательно посмотрите на третью строку. Совпадение с щаблоном начинается, как и ожидалось, со слова Далее совпадение включает слово last и текст дальше до следующего слова last. Здесь метасимвол * следует четвертому правилу, описанному в разделе "Правила игры": находится самая длинная строка, все еще удовлетворяющая шаблону поиска. В случаях, когда требуется отменить действие этого правила, необходимо воспользоваться возможностью минимального соответствия в Perl. За подробной

информацией по данному вопросу обратитесь к странице руководства perlre.

Классы символов

Другая типичная задача использования регулярных выражений - поиск, при котором подходит любой символ из определенного набора. Для поиска чисел хорошо иметь шаблон, соответствующий любой цифре, для поиска в списке имен типа Von Beethoven или von Beethoven вам пригодится шаблон "или v, или V.



Табл 6.2. Прлер! иcпользоEания клаccоE cолоE

В регулярных выражениях Perl такая возможность предусмотрена. Речь идет о так называемых классах символов. Классы символов заключаются в квадратные скобки [ ]. Во время поиска все символы в классе рассматриваются как один символ. Внутри класса можно задавать диапазон символов (когда такой диапазон имеет смысл), помещая дефис между границами диапазона. В табл. 6.2 приведено несколько примеров.

Класс cимEOлоE Описание

[abcde] Любой символ а, с, d или е

[а-е ] То же самое, любой символ а, с, d или е

[Gg] Прописная G или строчная д

[0-9] Цифра

[0-9]+ Последовательность одной или более цифр

[A-Za-z]{5} Последовательность из пяти алфавитно-цифровых символов

[*!fif$%S()] Любой из этих знаков пунктуации

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

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

/[*A-Z]/; f ЛюЕ символ!, кроне символов верхнего f регистра

Так как в классах символ, * и - имеют специальное значение, для их использования в классе существуют определенные правила. Литерал " не должен быть первым символом класса. Перед литералом ] должен стоять символ обратной косой черты, например /[аЬс\]]/. Для помещения в класс дефиса (-) достаточно либо поставить его на первую позицию, либо поместить перед ним символ обратной косой черты.

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

Таблица 6.3. Специаль1е солье класс

Шаблон

Описание

Символ, встречающийся в словах (латинский алфавит), то же, что и [a-zA-Z0-9 ]

Символ, не встречающийся в словах, инверсия \w Цифрам же, что и [0-9] Новой символ

Символ пробела, то же, что и U\f\r\n] Символ, не являющийся символом пробела

Чть I. :Ei Perl



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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122