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