Отличия от Perl

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

Отличия, описанные здесь, относятся к Perl 5.005.

 

1. По умолчанию "пробельными" символами считаются те, которые распознаются библиотечной функцией C isspace, хотя и существует возможность скомпилировать PCRE с другим набором символов. Обычно isspace распознает пробел, перевод станицы, перевод строки, возврат каретки, горизонтальную и вертикальную табуляцию. Perl 5 больше не включает вертикальную табуляцию в свой набор "пробельных символов". Escape-последовательность "\v", которая долгое время была в документации по Perl, на самом деле никогда не распознавалась. Тем не менее, сам это символ рассматривался как "пробельный" до версии 5.002. В версиях 5.004 и 5.005 он уже не совпадает с "\s".
 
2. PCRE не позволяет использовать квантификаторы повторения во впередсмотрящих утверждениях. Perl допускает их, но они не означают то, что вы возможно подумали. К примеру, утверждение (?!a){3} не говорит о том, что последующие три символа должны быть не "a". Оно всего лишь три раза утверждает, что последующий символ будет не "a".
 
3. Пошаблонам с захватом подстрок, находящимся внутри негативных впередсмотрящих утверждений, присваиваются порядковые номера, но их значение никогда не устанавливается. Perl устанавливает значение для таких подшаблонов до тех пор, пока не произойдет неудачное сравнение (то есть само отрицательное утверждение станет истинным). Но это происходит только для отрицательных впередсмотрящих утверждений, состоящих из одной ветви.
 
4. Хотя бинарный символ ноль допустим в исходной строке, он недопустим в шаблоне, так как шаблон передается как обычная C строка, завершающаяся нулем. Для того, чтобы задать бинарный ноль, следует использовать escape-последовательность "\0".
 
5. Не поддерживаются следующие escape-последовательности, допустимые в Perl: \l, \u, \L, \U, \E, \Q. На самом деле они относятся к общей обработке строк в Perl и не являются часть механизма сравнения шаблонов.
 
6. Не поддерживается утверждение Perl: \G, так как она не относится к сравнениям с единственным шаблоном.
 
7. По очевидным причинам, PCRE не поддерживается конструкцию (?{code}).
 
8. В момент написания в Perl 5.005_02 существовали некоторые странности связанные с установками захваченных подстрок, в случае, когда часть шаблона повторяется. К примеру, сравнение строки "aba" с шаблоном "^(a(b)?)+$" устанавливает $2 значение "b", в то время как сравнение "aabbaa" с "^(aa(bb)?)+$" оставляет $2 не установленным. Однако, если заменить шаблон на "^(aa(b(b))?)+$", то $2 (и $3) будут установлены. В Perl 5.004 $2 устанавливается в обоих случаях, то же самое можно сказать и о PCRE. Если в дальнейшем Perl примет другую единообразную стратегию поведения для таких случаев, то PCRE может последовать этим изменениям.
 
9. Еще одно до сих пор неразрешенное противоречие - это то, что в Perl 5.005_02 шаблон "^(a)?(?(1)a|b)+$" совпадет со строкой "a", в PCRE - нет. Тем не менее, и в Perl, и в PCRE совпадение шаблона "^(a)?a" со строкой "a" оставит $1 не установленным.
 
10. PCRE предоставляет некоторые расширения по сравнению с Perl:
· Хотя назадсмотрящие утверждения должны совпадать со строками фиксированной длины, в каждой ветви альтернатив эта длина может быть разной. Perl 5.005 требует, чтобы все они были одной длины.
· Если опция PCRE_DOLLAR_ENDONLY установлена, а PCRE_MULTILINE не установлена, то метасимвол "$" даст совпадение только в самом конце строки.
· Если установлена опция PCRE_EXTRA, то символ обратной косой черты, за которым следует буква, без специального значения, будет ошибочным.
· Если установлена опция PCRE_UNGREEDY, то "жадность" квантификаторов повторения инвертируется. То есть они становятся по умолчанию они не "жадные", но если за ними следует знак вопроса, то "жадные".