Классы символов
С помощью метасимволов можно обозначить в шаблоне один символ из заданного набора. Для этого нужно определить класс символов, указав в квадратных скобках набор символов, включаемых в класс. Классы символов похожи на шаблон с вариантами, в котором альтернативами могут быть только отдельные символы. Ради примера запишем шаблон для слов, отличающихся первой буквой из указанного набора:
/[вклрт]от/ # соответствуют: 'вот','кот','лот','рот','тот'
Вот пример шаблона с несколькими классами символов, каждый из которых представляет одну букву в последовательности из четырех символов:
/[мс][ул][хо][ан]/ # соответствуют: 'муха', 'слон' # а также: 'суоа', 'млхн', 'слоа' и так далее
В классе символов вместо перечисления можно указывать диапазон от начального до конечного символа, разделенных минусом:
[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'
Записывать несколько метасимволов подряд для указания в шаблоне последовательности из однотипных символов утомительно и неудобно, да и ошибиться при этом легко. Облегчить жизнь составителям регулярных выражений помогают квантификаторы.