Символьные классы

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

Символьный класс соответствует одиночному символу обрабатываемой строки, причем сам символ должен содержаться в наборе, определяемым классом. В случае, если первым символом описания класса является '^', логика работы инвертируется: класс соответствует одиночному символу, который не содержится в наборе, определяемым классом. Если символ '^' необходим как член класса, его не следует помещать первым символом в описании класса либо необходимо экранировать при помощи обратного слеша.

К примеру, символьный класс [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.

Коментарии

The documentation says:

"The character types \d, \D, \s, \S, \w, and \W may also appear in a character class, and add the characters that they match to the class."

It does not stress that other escape types may not.  I wanted to split a string on either a comma (","), or a new line "\n".  When my input stream began to include "\r\n", I decided to change "\n" to "\R".  Unfortunately, my test string did not include a capital "R", or I might have found the problem sooner.  My '/[\R,]/' was simply splitting on comma and the letter "R".

My test string...
"The Yum-Yum Company\r\n127 bernard street"

What DID work: '/(?:\R|,)+/'

["The Yum-Yum Company","127 bernard street"]

Given character classes only match one character, I can see clearly why my expectations were justifiably dashed, but hopefully this comment will save time for someone else.

I might add, this has taught me the value of PCRE_EXTRA (modifier "X"), which I have begun to use routinely now.
2018-05-03 07:52:59
http://php5.kiev.ua/manual/ru/regexp.reference.character-classes.html
From deep down the PCRE manual at http://www.pcre.org/pcre.txt :

         \d     any decimal digit
         \D     any character that is not a decimal digit
         \h     any horizontal white space character
         \H     any character that is not a horizontal white space character
         \s     any white space character
         \S     any character that is not a white space character
         \v     any vertical white space character
         \V     any character that is not a vertical white space character
         \w     any "word" character
         \W     any "non-word" character
2021-09-18 14:58:23
http://php5.kiev.ua/manual/ru/regexp.reference.character-classes.html
Автор:
Examples with Character classes

<?php

$stringA 
"1 In the beginning God created the heavens and the earth.";
$stringB preg_replace('/[[:^alnum:]]/'''$stringA); // string(46) "1InthebeginningGodcreatedtheheavensandtheearth"
$stringC preg_replace('/[[:^alpha:]]/'''$stringA); // string(45) "InthebeginningGodcreatedtheheavensandtheearth"
$stringD preg_replace('/[[:^ascii:]]/'''"Pokémon"); // string(6) "Pokmon"
$stringE preg_replace('/[[:^blank:]]/''*'$stringA); // string(57) "* ** *** ********* *** ******* *** ******* *** *** ******"
$stringF preg_replace('/[[:blank:]]/''-'$stringA); // string(57) "1-In-the-beginning-God-created-the-heavens-and-the-earth."

$stringG sprintf("Vertical Tabulation: %s"chr(11)); // string(22) "Vertical Tabulation:  "
$stringH preg_replace('/[[:cntrl:]]/'''$stringG); // string(21) "Vertical Tabulation: "
$stringLengthG strlen($stringG); // int(22)
$stringLengthH strlen($stringH); // int(21)

$stringI preg_replace('/[[:digit:]]/''''My age is 35'); //string(10) "My age is "
$stringJ preg_replace('/[[:^digit:]]/''''My age is 35'); // string(2) "35"

$stringK preg_replace('/[[:^graph:]]/'''$stringG); // string(19) "VerticalTabulation:"
$stringL preg_replace('/[[:graph:]]/'''$stringG); // string(3) "  "

$stringM preg_replace('/[[:lower:]]/'''$stringG); // string(6) "V T:  "
$stringN preg_replace('/[[:^lower:]]/'''$stringG); // string(16) "erticalabulation"

$stringO preg_replace('/[[:^print:]]/'''$stringG); // string(21) "Vertical Tabulation: "
$stringP preg_replace('/[[:print:]]/'''$stringG); // string(1) " "

$stringQ preg_replace('/[[:punct:]]/'''$stringG); // string(21) "Vertical Tabulation  "
$stringR preg_replace('/[[:^punct:]]/'''$stringG); // string(1) ":"

$stringS preg_replace('/[[:space:]]/'''$stringG); // string(19) "VerticalTabulation:"
$stringT preg_replace('/[[:^space:]]/'''$stringG); // string(3) "  "

$stringU preg_replace('/[[:upper:]]/'''$stringG); // string(20) "ertical abulation:  "
$stringV preg_replace('/[[:^upper:]]/'''$stringG); // string(2) "VT"

$stringW preg_replace('/[[:word:]]/'''$stringG); // string(4) " :  "
$stringX preg_replace('/[[:^word:]]/'''$stringG); // string(18) "VerticalTabulation"

$stringY preg_replace('/[[:xdigit:]]/''''abcdefghijklmnopqrstuvwxyz0123456789'); // string(20) "ghijklmnopqrstuvwxyz"
$stringZ preg_replace('/[[:^xdigit:]]/''''abcdefghijklmnopqrstuvwxyz0123456789'); // string(16) "abcdef0123456789"
2023-02-08 14:48:36
http://php5.kiev.ua/manual/ru/regexp.reference.character-classes.html

    Поддержать сайт на родительском проекте КГБ