Отличия от Perl
Описанные здесь отличия относятся к версии Perl 5.005.
-
По умолчанию пробельный символ — любой символ, который функция isspace()
из библиотеки C опознает таковым, хотя возможно скомпилировать PCRE с альтернативными
таблицами символов. Функция isspace() определяет как пробельный следующие символы:
пробел, конец страницы (formfeed), перевод строки, возврат каретки, горизонтальную
табуляцию и вертикальную табуляцию. Perl 5 же не включает вертикальную табуляцию в
список пробельных символов. Экранирование \v долгое время присутствовавшее в
документации Perl на самом деле никогда не распознавалось. Однако, символ как таковой,
считался за пробельный до версии 5.002. В 5.004 и 5.005 он не определяется как \s.
-
PCRE не позволяет использовать квантификаторы повторения в опережающих
предположениях. Perl разрешает, но они не означают того, о чем вы могли подумать. К
примеру, (?!a){3} не проверяет, что следующие три символа не "a". Проверяется только то,
что следующий символ не "a" три раза.
-
Захватывающие подшаблоны, которые возникают в отрицательных опережающих проверках
считаются, но их записи в векторе смещений никогда не устанавливаются. Perl
устанавливает числовые переменные из любых подобных масок, которые совпали до
момента, когда предположение не подтвердилось при проверке чего-либо, но только если
опережающее предположение содержит только одну ветвь.
-
Хотя бинарные нулевые символы поддерживаются в проверяемой строке, они недопустимы
в строке шаблона, потому что она передаётся как нормальная C-строка, в которой этот
символ обозначает конец строки. Для его использования в строке шаблона необходимо
пользоваться конструкцией "\x00".
-
Следующие экранирующие последовательности Perl не поддерживаются:
\l, \u, \L, \U. Фактически они реализованы стандартным обработчиком строк Perl и
не являются частью модуля обработки регулярных выражений.
-
Предположение \G из Perl также не поддерживается, поскольку не имеет отношения к
отдельно взятой схеме совпадений.
-
Довольно очевидно, что PCRE не поддерживает конструкции (?{code}) и (??{code}).
Тем не менее, есть поддержка рекурсивных шаблонов.
-
Есть ещё странный момент при в Perl 5.005_02, связанный с установкой захваченных строк,
когда часть шаблона повторяется. К примеру, проверка "aba" шаблоном /^(a(b)?)+$/,
устанавливает $2 в значение "b", но проверка "aabbaa" шаблоном /^(aa(bb)?)+$/,
оставляет $2 не выставленной. Хотя, если шаблон поменять на /^(aa(b(b))?)+$/, то $2
(и $3) будут установлены. В Perl 5.004, $2 установится в обоих случаях, и это также
истинно и для PCRE. Если в будущем Perl как-либо зафиксирует это поведение, PRCE
будет ему следовать.
-
Другое до сих пор неразрешённое противоречие в том, что Perl 5.005_02, шаблоном
/^(a)?(?(1)a|b)+$/ распознает строку "a", а PCRE нет. Хотя и в Perl и в PCRE, /^(a)?a/
распознает "a" и оставляет $1 не выставленной.
-
PCRE предоставляет некоторые расширения регулярных выражений Perl:
-
Несмотря на то, что опережающие предположения должны распознавать строки
фиксированной длины, каждое альтернативное ретроспективное предположение
может распознавать строки разной длины. Perl 5.005 требует, чтобы они были одной
длины.
-
Если установлена PCRE_DOLLAR_ENDONLY
и не установлена PCRE_MULTILINE,
метасимвол $ распознается только в самом конце строки.
-
Если установлена PCRE_EXTRA,
обратный слеш с последующей за ним буквой, не имеющий специального значения,
приводит к ошибке.
-
Если установлена PCRE_UNGREEDY,
жадность квантификаторов повторения инвертирована. То есть по умолчанию они не
жадные, пока за ними не будет знак вопроса.