Синтаксис патэрна - Описывает синтаксис PCRE regex.
Описание
Библиотека PCRE это набор функций, реализующих подстановку патэрнов
регулярных выражений с использованием синтаксиса и семантики Perl 5 с
незначительными отличиями (см. далее). Текущая реализация соответствует Perl 5.005.
Отличия от Perl
Эти отличия даны относительно Perl 5.005.
По умолчанию пробельным символом считается любой таковой символ,
распознаваемый функцией isspace() библиотеки С, хотя возможна компиляция PCRE
с альтернативной таблицей типов символов. Нормально isspace() распознаёт space, formfeed, newline,
carriage return, horizontal tab и vertical tab. Perl 5 больше не включает vertical tab в набор пробельных символов.
Мнемоника v, которая долгое время была в документации Perl, фактически
никогда не распознавалась. Однако сам по себе этот символ рассматривался
как пробельный как минимум до версии 5.002. В 5.004 и 5.005 он не соответствует s.
PCRE не разрешает повторение квантификаторов или опережающих утверждений/lookahead
assertions. Perl разрешает их, но они имеют другое значение. Например, (?!a){3}
не утверждает, что три последующие символа не "a". Оно просто утверждает три раза, что следующий символ не "a".
Захваты субпатэрнов, которые возникают внутри отрицательного опережающего
утверждения, вычисляются, но их вхождения в векторе смещения никогда не
устанавливаются. Perl устанавливает свои числовые переменные из любого
такого патэрна, который совпадает до неудачи утверждения при совпадении с
чем-либо (продолжая таким образом), но только если негативное опережающее утверждение содержит одну ветвь.
Хотя двоичные нулевые символы поддерживаются в строке-субъекте, они не
допускаются в строке патэрна, поскольку он передаётся как нормальная C-строка,
оканчивающаяся нулём. Замена "x00" может использоваться в патэрне для представления бинарного нуля.
Следующие escape-последовательности (мнемоники) Perl не поддерживаются:
l, u, L, U, E, Q. Фактически они реализованы в общей обработке строк в
Perl и не являются частью его машины патэрнов.
Perl-утверждение G не поддерживается, так как оно не относится к одиночным совпадениям патэрна.
Вполне очевидно, что PCRE не поддерживает конструкцию (?{code}).
На момент написания в Perl 5.005_02 имелись некоторые странности, касающиеся установок захваченных
строк, если часть патэрна повторяется. Например, сравнение "aba" с патэрном /^(a(b)?)+$/ устанавливает в $2 значение
"b", но сравнение "aabbaa" с /^(aa(bb)?)+$/ оставляет $2 не установленной. Однако, если патэрн изменить на
/^(aa(b(b))?)+$/ , то $2 (и $3) устанавливаются.
В Perl 5.004 переменная $2 устанавливается в обоих случаях и является TRUE в PCRE. Если
в будущем Perl будет изменён для приведения этого в соответствие, PCRE может также измениться.
Другое пока не разрешённое несоответствие - то, что в Perl
5.005_02 патэрн /^(a)?(?(1)a|b)+$/ совпадает со строкой "a", а в PCRE - нет. Однако и в Perl, и в
PCRE патэрн /^(a)?a/ совпадает с "a" и оставляет $1 не установленной.
PCRE предоставляет некоторые расширения к регулярным выражениям Perl:
Хотя смотрящие назад/lookbehind утверждения обязаны совпадать со строками
фиксированной длины, каждая альтернативная ветвь lookbehind-утверждения
может со строкой другой длины. Perl 5.005 требует, чтобы все они имели одну длину.
установлено, а
PCRE_MULTILINE - нет, метасимвол $ совпадает только с самым концом строки.
Если PCRE_EXTRA установлено, то обратный слэш
с буквой, не имеющей специального значения, является ошибочным.
Если PCRE_UNGREEDY установлено, то жадность
квантификаторов повторения инвертируется, то есть, по
умолчанию они будут нежадными, но если за ними следует знак вопроса, будут жадными.
Регулярные выражения. Детали.
Введение
Ниже описаны синтаксис и семантика регулярных выражений, поддерживаемых в PCRE.
Регулярные выражения описаны также в документации Perl и в некоторых других
книгах, некоторые из которых содержат копии примеров. Книга Jeffrey
Friedl'а "Mastering Regular Expressions", опубликованная
O’Reilly (ISBN 1-56592-257-3), рассматривает их в деталях.
Данное описание может служить справочником.
Регулярное выражение это патэрн, который сравнивается со строкой-субъектом
слева направо. Большинство символов в патэрне представляют сами себя и
совпадают с соответствующими символами в строке-субъекте. В качестве тривиального примера - патэрн
The quick brown fox совпадает с частью строки-субъекта, которая полностью идентична ему.
Метасимволы
Мощность регулярным выражениям придаёт возможность включать в патэрн
альтернативы и повторения. Они кодируются в патэрне метасимволами,
которые не представляют самих себя, а интерпретируются особым образом.
Имеются два различных набора метасимволов: распознаваемые в любом месте патэрна, кроме квадратных скобок,
и те, которые распознаются в квадратных скобках.
Вот символы за пределами квадратных скобок:
общий escape-символ для различных вариантов использования
^
начало утверждения субъекта (или строки, в многострочном режиме)
$
конец утверждения субъекта (или строки, в многострочном режиме)
.
совпадает с любым символом, кроме newline (по умолчанию)
[
начало определения класса символов
]
конец определения класса символов
|
начало альтернативной ветви
(
начало субпатэрна
)
конец субпатэрна
?
расширяет значение (, также квантификатор 0 или 1, также минимизатор квантификатора
*
квантификатор 0 или более
+
квантификатор1 или более
{
начало min/max квантификатора
}
конец min/max квантификатора
Часть патэрна в квадратных скобках называется "классом символов".
В классе символов метасимволами являются только:
общий escape-символ
^
отрицает этот класс, но только если является первым символом
-
обозначает диапазон символов
]
конец класса символов
В следующих разделах рассматривается использование каждого из этих метасимволов.
backslash/обратный слэш
Символ backslash используется
по-разному. Во-первых, если после него идёт неалфавитный символ, он отменяет любое специальное значение, которое символ
может иметь. Такое использование обратного слэша как escape-символа применяется как внутри, так и вне классов символов.
Например, если вы хотите найти совпадение с символом "*", вы записываете в патэрне
"*". Это будет работать независимо от того, может ли последующий
символ интерпретироваться как метасимвол, поэтому всегда надёжнее
записывать неалфавитный символ с "", чтобы специфицировать, что он
представляет сам себя. Особенно если вы хотите найти совпадение с backslash - тогда вы записываете "".
Если патэрн компилируется с опцией PCRE_EXTENDED, то пробелы
в патэрне (кроме пробелов в классе символов) и символы между "#"
вне класса символов и следующим символом newline игнорируются.
Символ обратного слэша может использоваться для включения в патэрн пробела или символа "#".
Во-вторых, backslash предоставляет способ кодирования в патэрне
непечатаемых символов видимым образом. Ограничений на появление непечатаемых
символов нет, за исключением двоичного нуля, который оканчивает патэрн,
но если патэрн подготавливается путём редактирования текста, то обычно
легче использовать одну из следующих escape-последовательностей (замен), а не бинарный символ, представляемых ими:
a
alarm/предупреждение, то есть символ BEL (hex 07)
cx
"control-x", где x это любой символ
e
escape (hex 1B)
f
formfeed/прогон страницы (hex 0C)
newline/новая строка (hex 0A)
carriage return/возврат каретки (hex 0D)
tab/табуляция (hex 09)
xhh
символ с 16-ричным кодом hh
ddd
символ с 8-ричным кодом ddd, или backreference/обратная ссылка
Эффект от применения "cx" таков: если "x" это символ в нижнем регистре,
он конвертируется в верхний регистр. Затем бит 6 символа (hex 40) инвертируется. Таким образом,
"cz" становится hex 1A, "c{" становится hex 3B, а "c;" становиться hex 7B.
После "x" читаются не более двух 16-ричных цифр (буквы могут быть в любом регистре).