Отличия от 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,
жадность квантификаторов повторения инвертирована. То есть по умолчанию они не
жадные, пока за ними не будет знак вопроса.