"\" - обратная косая черта

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

Символ обратной косой черты (backslash) используется в нескольких случаях. Прежде всего, если за ним следует не алфавитно-цифровой символ, то устраняется любой специальный смысл, который мог бы иметь этот символ. Такое использование обратной косой черты как escape-символа допустимо как вне, так и внутри классов символов.

 

К примеру, если вы хотите, чтобы произошло совпадение с символом "*", в шаблоне нужно написать "\*". Это правило будет использовано даже в том случае, если символ, следующий за обратной косой чертой не рассматривался бы как мета-символ. Таким образом, всегда безопасно предварять не алфавитно-цифровые символы символом обратной косой черты, когда предполагается их непосредственное использование в шаблоне. В частности, если вы хотите задать сам символ косой черты, следует написать "\\".

 

Если шаблон компилируется с опцией PCRE_EXTENDED, то пробелы, переводы строки и все, что находится между символами "#" игнорируется. Это не касается классов символов. Для включения в шаблон пробела и самого символа "#" следует предварить их символом обратной косой черты: "\ " и "\#".

 

Другое использование символа обратной косой черты - это предоставление возможности задания непечатных символов внутри шаблона. Не существует ограничений относительно использования непечатных символов внутри шаблона, за исключением использования бинарного нуля для завершения шаблона, но когда шаблон подготавливается при помощи редактора текста обычно удобнее пользоваться одной из следующих escape-последовательностей вместо бинарного символа, который он представляет:

 

\a

Звонок, то есть символ BEL (hex 07)

\cx

"Ctrl-x", где x любой символ

\e

Escape (hex 1B)

\f

Перевод страницы (hex 0C)

\n

Новая строка (hex 0A)

\r

Перевод каретки (hex 0D)

\t

Табуляция (hex 09)

\xhh

Символ с шестнадцатеричным кодом hh

\ddd

Символ с восьмеричным кодом ddd, или обратная ссылка

 

Точный эффект использования "\cx" следующий: если "x" - это символ в нижнем регистре, то он конвертируется в верхний регистр. Затем 6-й бит символа (hex 40) инвертируется. Таким образом "\cz" превращается в hex 1A, но "\c{" превращается в hex 3B, в то время как "\c;" превращается в hex 7B.

 

После "\x" читается до двух шестнадцатеричных цифр, которые могут быть как в верхнем, так и в нижнем регистре. После "\0" читается до двух восьмеричных цифр. В обоих случаях, если присутствует менее двух цифр, то используются только те, что есть. Таким образом, последовательность "\0\x\07" задает два бинарных нуля, за которыми следует символ звонок (BEL). Убедитесь, что вы задали две цифры после начального нуля, если последующие символы могут быть проинтерпретированы как восьмеричные цифры.

 

Обработка символа обратной косой черты, за которым следует ненулевая цифра, достаточно сложна. За пределами класса символов PCRE читает ее и все последующие цифры как десятичное число. Если это число меньше 10, или если в выражение присутствовало, по крайней мере, такое или большее количество открывающихся скобок, такая последовательность рассматривается как обратная ссылка. Описание того, как это работает, будет дано позже, после обсуждения подшаблонов заключенных в скобки.

 

Внутри класса символов или если десятичное число больше 9 и количество обнаруженных подшаблонов меньше этого числа, то PCRE перечитывает до трех восьмеричных цифр следующих после символа обратной косой черты. После этого генерируется единственный байт из младших 8 бит числа. Любые последующие цифры используются так, как они есть. Например:

 

\040

Альтернативный путь задания символа пробела

\40

Тоже пробел, но при условии, что до этого было обнаружено менее 32 подшаблонов

\7

Всегда обратная ссылка

\11

Может быть обратной ссылкой, или альтернативным способом задания символа табуляции

\011

Всегда символ табуляции

\0113

Символ табуляции, за которым следует символ "3"

\113

Символ с восьмеричным кодом 113 (при условии, что было не более 99 обратных ссылок)

\377

Байт, состоящий из одних единичных битов

\81

Либо обратная ссылка, либо двоичный ноль, за которым следует два символа "8" и "1"

 

Следует отметить, что восьмеричные величины со значением 100 и более не должны предваряться нулем, так как читается не более трех цифр.

 

Все последовательности, которые определяют один байт, могут использоваться как внутри, так и вне класса символов. В дополнение, внутри класса символов, последовательность "\b" интерпретируется как символ забоя (backspace) hex 08. Вне класса символов, эта последовательность имеет другое значение (смотри ниже).

 

Третьим применением символа обратной косой черты является задание обобщенных типов символа:

 

\d

Любая десятичная цифра

\D

Любой символ не являющийся десятичной цифрой

\s

Любой пробельный символ

\S

Любой символ не являющийся пробельным

\w

Любой символ из множества "словесных"

\W

Любой символ не являющийся символом из множества "словесных"

 

Каждая пара escape-последовательностей (заглавная и строчная буквы) разделяет полный набор символов на два непересекающихся множества. Любой заданный символ входит в одну и только одну escape-последовательность из пары.

 

Множество "словесных" символов - это любая буква, цифра или символ подчеркивания "_", то есть любой символ, который может быть частью "слова" в языке Perl. Определения букв и цифр задаются в PCRE таблицами символов и могут отличаться, если сравнение ведется с учетом локализации. К примеру, при использовании французской локализации, среди символов с кодами больше 128 встречаются буквы, соответственно, такие символы будут совпадать с \w.

 

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

 

Четвертым применением символа обратной косой черты является задание некоторых простых утверждений. Утверждение представляет собой некоторое условие, которое должно быть соблюдено в некоторой точке сравнения, при этом символы из исходной строки не потребляются и текущая позиция не меняется. Использование подшаблонов для более сложных утверждений описано далее. При помощи символа обратной косой черты можно задавать следующие утверждения:

 

\b

Граница слов

\B

Не граница слов

\A

Начало исходной строки (не зависит от режима многострочности)

\Z

Конец исходной строки или перевод строки в ее конце (не зависит от режима многострочности)

\z

Конец исходной строки (не зависит от режима многострочности)

 

Эти утверждения не могут появляться внутри классов символов. Заметьте, что \b имеет внутри класса символов совершенно другое значение, а именно означает символ забоя (backspace).

 

Граница слов - это позиция в исходной строке, где исходный и предыдущий символы не принадлежат одновременно множеству \w или \W (то есть один принадлежит \w, а другой \W). Границей слов также являются начало или конец строки, когда первый или последний символ принадлежит множеству \w.

Утверждения \A, \Z, и \z отличаются от традиционных "^" и "$" (описанных ниже) тем, что совпадают только с началом и концом строки, вне зависимости от установки опций. На них не влияют опции PCRE_NOTBOL или PCRE_NOTEOL. Разница между \Z и \z в том, что \Z истинно как перед символом перевода строки, который является последним символом в строке, так и в самом конце строки, в то время как \z истинно только в самом конце строки.