Открывающая квадратная скобка объявляет начало символьного класса, завершаемого закрывающей квадратной скобкой. Символ ']' не имеет специального значения, и в случае, если закрывающая квадратная скобка необходима как член символьного класса, она должна быть первым символом непосредственно после открывающей квадратной скобки (если используется метасимвол '^', то непосредственно после него), либо экранироваться при помощи обратного слеша.
Символьный класс соответствует одиночному символу обрабатываемой строки, причем сам символ должен содержаться в наборе, определяемым классом. В случае, если первым символом описания класса является '^', логика работы инвертируется: класс соответствует одиночному символу, который не содержится в наборе, определяемым классом. Если символ '^' необходим как член класса, его не следует помещать первым символом в описании класса либо необходимо экранировать при помощи обратного слеша.
К примеру, символьный класс [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 | строчные буквы |
печатные символы, включая пробел | |
punct | печатные символы, исключая буквы и цифры |
space | пробельные символы(почти то же самое, что и \s) |
upper | прописные буквы |
word | символы "слова" (то же самое, что и \w) |
xdigit | шестнадцатеричные цифры |
Название word - это расширение Perl, а blank - расширение GNU, начиная с версии Perl 5.8. Другое расширение Perl - это отрицание, которое указывается символом ^ после двоеточия. Например, [12[:^digit:]] совпадет с "1", "2", или с любой не-цифрой.
В режиме UTF-8, символы со значениями, превышающими 128, не совпадут ни с одним из символьных классов POSIX. Начиная с PHP 5.3.0 и libpcre 8.10 некоторые символьные классы изменены, чтобы использовать свойства символов Unicode, в этом случае упомянутое ограничение не применяется. Читайте » руководство PCRE(3) для подробностей.
Свойства символов Unicode могут возникнуть внутри символьного класса. Они не могут быть частью диапазона. Символ минус (дефис), после символьного класс Unicode будет совпадать буквально. Попытка закончить диапазон с помощью свойства символа Unicode вызовет предупреждение.