Анимация
JavaScript
|
Главная Библионтека Непечатные символы Ранее вы узнали, что для включения метасимвола в регулярное выражение В виде литерала перед ним необходимо поставить символ обратной косой черты и тогда метасимвол потеряет свою магическую силу: Если перед обычным символом поставить символ обратной косой черты, он становится метасимволом. Как вы уже знаете из 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
более ограниченный диапазон действия у метасимвола ?. Предшествующий ему символ должен встречаться нуль или один раз (но не более того). Так, шаблон /с?о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 |