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

/[вклрт]от/ # соответствуют: 'вот','кот','лот','рот','тот'

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

/[мс][ул][хо][ан]/ # соответствуют: 'муха', 'слон' # а также: 'суоа', 'млхн', 'слоа' и так далее

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

[0-9] вместо [0123456789] [A-Z] вместо [ABCDEFGHIJKLMNOPQRSTUVWXYZ]

Указывая несколько диапазонов в одном классе, запишем шаблон для шестнадцатеричной цифры:

/[0-9a-fA-F]/# соответствуют: '5', 'b', 'D' и так далее

Чтобы включить в символьный класс знак '-', нужно поместить его в начале или в конце перечисленных в классе символов или экранировать обратной чертой. Помещенные в символьный класс, все метасимволы (кроме ']') рассматриваются как обычные символы. Поэтому так могут выглядеть шаблоны для поиска знака препинания или одной из скобок:

[-.,;:!?] # знаки препинания [()[\]{}] # скобки: \] представляет скобку ']'

Иногда требуется выразить понятие "все, кроме указанных символов": для этого в описании класса символов сразу после открывающей квадратной скобки ставится метасимвол отрицания ('^'). Например, так можно записать шаблоны для "любого символа, кроме знаков препинания" или "любого нецифрового символа":

[^-.,;:!?] # все, кроме этих знаков препинания [^0-9] # не цифры

Чтобы включить в символьный класс символ '^', нужно поставить его не первым в списке символов или отменить его специальное значение с помощью символа '\':

[*^] или так: [\^]

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

\d - любая десятичная цифра, то есть [0-9] \D - любой символ, кроме цифры: [^0-9] или [^\d] \w - символ, пригодный для записи идентификатора:[a-zA-Z0-9_] \W - противоположность символа \w, то есть [^\w] \s - пробельный символ: пробел, \t, \n, \r или \f \S - любой не пробельный символ, то есть [^\s]

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

$text = "Альбом 'Dire Straits'\tГод 1978\tВремя 41:21"; $text =~ m{\s\d\d\d\d\s}; # найдет ' 1978\t'

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

Квантификатор (quantifier) - это обозначение числа повторений предыдущего шаблона при поиске соответствия. Количество повторений может задаваться одним или парой десятичных чисел в фигурных скобках:

{n} повторяется точно n раз {n,} повторяется n и более раз {n,m} повторяется от n до m раз включительно

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

/\d{5}/ # ровно пять цифр, то есть: \d\d\d\d\d /\s{1,}/ # один и более пробельных символов /[A-Z]{1,8}/ # от 1 до 8 заглавных латинских букв

Опишем с применением квантификаторов шаблон для поиска в тексте последовательности, похожей на телефонный номер, в следующем формате:

символ + \+ код страны: не менее 1 цифры \d{1,} открывающая скобка ( \( код города: 3 цифры и более \d{3,} закрывающая скобка ) \) номер абонента: от 4 до 7 цифр \d{4,7}

Перед знаками "+", "(" и ")" ставится обратная наклонная черта, чтобы они не воспринимались как метасимволы. Вот какое регулярное выражение получится в результате:

m"\+\d{1,}\(\d{3,}\)\d{4,7}"

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

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