Символьные классы
Открывающая квадратная скобка объявляет начало символьного класса,
завершаемого закрывающей квадратной скобкой. Символ «]» не имеет специального
значения, и Если закрывающая квадратная скобка необходима как член
символьного класса, она должна быть первым символом непосредственно после
открывающей квадратной скобки (если указан метасимвол «^», то
непосредственно после него), либо экранироваться при помощи обратного слеша.
Символьный класс соответствует одиночному символу обрабатываемой строки,
причём сам символ должен содержаться в наборе, определяемым классом.
Если первым идёт символ описания класса — «^», логика работы инвертируется:
класс соответствует одиночному символу, который не содержится в наборе,
определяемым классом. Если символ «^» необходим как член класса,
его не нужно помещать первым символом в описании класса, либо
необходимо экранировать при помощи обратного слеша.
Например, символьный класс [aeiou] соответствует любой гласной букве
в нижнем регистре, в то время, как [^aeiou] соответствует любому символу,
не являющемуся гласной буквой нижнего регистра.
Следует понимать, что символ «^» всего лишь удобный инструмент для описания
символов, не используемых в сопоставлении, это не утверждение,
так как он всё же занимает символ в обрабатываемой строке, и
не совпадёт, если текущая позиция сравнения находится в конце строки.
Если производится регистронезависимое сопоставление,
любая буква символьного класса соответствует как своему верхнему,
так и нижнему регистру. Таким образом символьный класс [aeiou]
соответствует как «A», так и «a».
Аналогично, класс [^aeiou] не соответствует ни «A», ни «a», тогда как в
регистрозависимом режиме совпадение бы состоялось.
Внутри символьного класса у символа перевода строки «\n» нет специального
значения, независимо от наличия модификаторов
PCRE_DOTALL и
PCRE_MULTILINE.
Символьные классы, построенные на отрицании, например [^a], всегда
соответствуют символу перевода строки.
Символ минус «-» (дефис) внутри класса используется для задания
символьного диапазона. Например, [d-m] соответствует любому символу,
находящемуся между «d» и «m», включая сами символы «d» и «m».
Если «-» необходим, как член класса,
он должен находиться в такой позиции, в которой он не может интерпретироваться
как диапазон (как правило, это первый и последний символ описания класса),
либо экранироваться при помощи обратного слеша.
Недопустимо использовать закрывающую квадратную скобку «]» в качестве границы
символьного диапазона. Например, шаблон «[W-]46]» будет интерпретирован
как символьный класс, состоящий из двух символов («W» и «-»), за которыми
следует строка «46]», таким образом шаблон будет соответствовать
строкам «W46]» или «-46]».
Чтобы всё же использовать символ «]» в описании диапазона, его необходимо
экранировать обратным слешем, например, шаблон [W-\]46] будет
интерпретирован как символьный класс, состоящий из символьного диапазона
вместе с двумя последующими символами «4» и «6».
Такого же результата можно достичь используя шестнадцатеричное
или восьмеричное представление символа «]».
Для построения символьных диапазонов используется ASCII представление
символов. Таким образом пограничные символы можно задавать непосредственно
в числовом представлении, например, [\000-\037].
Если выполняется регистронезависимый поиск,
символы, описанные в диапазоне, также будут соответствовать символам обеих
регистров. Например, диапазоны [W-c] и [][\^_`wxyzabc] эквивалентны
(в случае регистронезависимого поиска). Например, если установлена локаль
«fr» (Франция), можно использовать [\xc8-\xcb] для задания
соответствия ударному «E» в обоих регистрах.
Общие типы символов \d, \D, \s, \S, \w и \W тоже можно использовать
в символьных классах, добавляя при этом в класс те символы,
которым соответствуют. Например, класс [\dABCDEF] соответствует
любой шестнадцатеричной цифре. Символ «^» может использоваться совместно
с общим типом, взятым в верхнем регистре, для указания более узкого
набора символов. Например, класс [^\W_] соответствует любой букве или цифре,
но не символу подчёркивания.
Все не буквенно-цифровые символы, кроме \, -, ^ (вначале) и завершающего «]»,
не являются специальными символами, но использование экранирующего
слеша перед ними не навредит. Символ конца шаблона всегда является особым
случаем и всегда должен быть проэкранирован внутри выражения.
Perl поддерживает нотацию POSIX для символьных классов. Это включает
использование имён, заключённых в [:
и :]
,
в свою очередь заключённых в квадратные скобки. PCRE также поддерживает эту
запись. Например, [01[:alpha:]%]
совпадёт с
«0», «1», любым алфавитным символом или «%». Поддерживаются следующие имена
классов:
Символьные классы
alnum | буквы и цифры |
alpha | буквы |
ascii | символы с кодами 0–127 |
blank | только пробел или символ табуляции |
cntrl | управляющие символы |
digit | десятичные цифры (то же самое, что и \d) |
graph | печатные символы, исключая пробел |
lower | строчные буквы |
print | печатные символы, включая пробел |
punct | печатные символы, исключая буквы и цифры |
space | пробельные символы(почти то же самое, что и \s) |
upper | прописные буквы |
word | символы «слова» (то же самое, что и \w) |
xdigit | шестнадцатеричные цифры |
Класс пробельных символов (
space
) — это горизонтальная табуляция (HT, 9),
перевод строки (LF, 10), вертикальная табуляция (VT, 11), разрыв страницы (FF, 12),
возврат каретки (CR, 13) и пробел (32). Учтите, что этот список включает
вертикальную табуляцию (VT, код 11). Это отличает «space» от
\s
,
который не включает этот символ (для совместимости с Perl).
Название word
— это модуль Perl, а blank
—
модуль GNU, начиная с версии Perl 5.8. Другой модуль Perl — это
отрицание, которое указывается символом ^
после
двоеточия. Например, [12[:^digit:]]
совпадёт с «1», «2»,
или с любой не-цифрой.
В режиме UTF-8, символы со значениями, превышающими 128, не совпадут ни с одним
из символьных классов POSIX.
Начиная с libpcre 8.10 некоторые символьные классы изменены, чтобы
использовать свойства символов Unicode, в этом случае упомянутое ограничение не применяется.
Читайте » руководство PCRE(3) для подробностей.
Свойства символов Unicode могут возникнуть внутри символьного класса.
Они не могут быть частью диапазона. Символ минус (дефис), после символьного
класс Unicode будет совпадать буквально. Попытка закончить диапазон
с помощью свойства символа Unicode вызовет предупреждение.