"[" и "]" квадратные скобки

Наверх  Предыдущий  Следующий

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

 

Класс символов совпадает с единственным символом в исходной строке. Этот символ должен входить в множество, определенное классом, либо, если в начале определения присутствует "^", не входить в это множество. Если требуется включить символ "^" в класс, то он должен быть либо не первым символом в определении, либо перед ним должен быть символ обратной косой черты "\".

К примеру, класс символов [aeiou] совпадет с любой гласной буквой в нижнем регистре, в то время как [^aeiou] совпадет с любым символом, не являющимся гласной в нижнем регистре. Заметьте, что символ "^" это просто удобный способ задания множества символов путем перечисления символов, не входящих в это множество. Класс символов не является утверждением, он потребляет символ из исходной строки и не совпадает, если текущая позиция находится в конце исходной строки.

 

Когда установлен режим сравнения без учета регистра, символы в определении класса представляют обе версии символа (в верхнем и в нижнем регистре). Так, к примеру, сравнение с классом [aeiou] в режиме без учета регистра будет успешным как для "A" так и для "a", а сравнение с классом [^aeiou] режиме без учета регистра будет неуспешным для "A", в то время как с учетом регистра оно было бы успешным.

 

Символ перевода строки в классе символов никогда не рассматривается специальным образом, вне зависимости от установки опций PCRE_DOTALL и PCRE_MULTILINE. Так, сравнение [^a] с символом перевода строки всегда будет успешным.

 

Символ минус "-" может использоваться для указывания диапазонов символов внутри класса. К примеру [d-m] совпадет с любой буквой между "d" и "m" включительно. Если символ минус "-" сам должен присутствовать в классе символов, то перед ним должен стоять символ обратной косой черты "\", либо он должен находится в позиции, когда его нельзя проинтерпретировать как указатель диапазона, то есть в начале или в конце определения класса.

 

Запрещается указывать символ "]"  в качестве конца диапазона символов. То есть шаблон [W-]46] будет проинтерпретирован как класс из двух символов "W" и "-" за которым следует строка "46]" и, таким образом будет совпадение со строками "W46]" или "-46]". Тем не менее, если перед символом "]" стоит символ обратной косой черты "\", то он будет проинтерпретирован как конец диапазона. То есть [W-\]46] будет проинтерпретирован как единственный класс, состоящий из указания диапазона за которым указаны еще два отдельных символа. В качестве конца диапазона может также использоваться восьмеричное или шестнадцатеричное представление символа "]".

 

Диапазоны указываются для набора символов ASCII. В диапазонах можно использовать числовые коды символов, к примеру: [\000-\037]. Если диапазон включает буквы и установлен режим проверки без учета регистра, то совпадение будет происходить с буквами в любом регистре. К примеру, объявление [W-c] эквивалентно объявлению [][\^`wxyzabc] в режиме без учета регистра.

 

Типы символов \d, \D, \s, \S, \w и \W также могут использоваться в определениях классов символов, при этом они добавляют в класс символы, которым соответствуют. К примеру, [\dABCDEF] совпадет с любой шестнадцатеричной цифрой. Символ "^" может использоваться  совместно с типами символов в верхнем регистре для удобного задания более ограниченных наборов символов, чем те, которые получаются при использовании соответствующего типа символов в нижнем регистре. Так, к примеру [^\W_] совпадет с буквой или цифрой, но не с символом "_".

 

Хотя любые не алфавитно-цифровые символы, за исключением "\", "-" и "^" (в начале), и завершающего "]" не имеют специального смысла внутри класса символов, ничто не запрещает предварять их символом обратной косой черты "\".