Diferenças para o Perl
As diferenças descritas aqui referem-se ao Perl 5.005.
- Por padrão, um caractere de espaço em branco é qualquer caractere que a função isspace() da biblioteca C reconhece, embora seja possível compilar PCRE com tabelas de tipos de caracteres alternativas. Normalmente isspace() corresponde a espaço, alimentação de formulário, nova linha, retorno de carro, tabulação horizontal e tabulação vertical. Perl 5 não inclui mais a tabulação vertical em seu conjunto de caracteres de espaço em branco. O escape \v que esteve na documentação do Perl por muito tempo nunca foi de fato reconhecido. No entanto, o caractere em si foi tratado como espaço em branco pelo menos até a versão 5.002. Na 5.004 e na 5.005, ele não corresponde a \s.
- O PCRE não permite quantificadores repetidos em afirmações antecipadas. O Perl permite isso, mas eles não significam o que se imagina. Por exemplo, (?!a){3} não afirma que os próximos três caracteres não são "a". Apenas afirma que o próximo caractere não é “a” três vezes.
- A captura de sub-expressões que ocorrem dentro de afirmações antecipadas negativas são contadas, mas suas entradas no vetor de deslocamentos nunca são definidas. O Perl define suas variáveis numéricas a partir de quaisquer expressões que sejam correspondidas antes que a afirmação falhe em corresponder a algo (deste modo tendo sucesso), mas apenas se a afirmação antecipada negativa contiver apenas uma ramificação.
- Embora caracteres zero binários sejam suportados na string de entrada, eles não são permitidos na string da expressão (antes do PHP 8.2) porque ela é passada como uma string C normal, terminada por zero. A sequência de escape "\x00" pode ser usada na expressão para representar um zero binário. A partir do PHP 8.2, caracteres NUL \0 são suportados na string da expressão regular.
- As seguintes sequências de escape do Perl não são suportadas: \l, \u, \L, \U. Na verdade, eles são implementados pelo tratamento geral de strings do Perl e não fazem parte de seu mecanismo de correspondência de expressões.
- A asserção Perl \G não é suportada porque não é relevante para correspondências de expressões únicas.
- Obviamente, a PCRE não suporta a construção (?{code}) e (??{code}). No entanto, há suporte para expressões recursivas.
-
No momento em que este artigo foi escrito, havia algumas curiosidades no Perl
5.005_02 relacionadas às configurações de strings capturadas
quando parte de uma expressão é repetida. Por exemplo, corresponder
"aba" com a expressão /^(a(b)?)+$/ define $2 como o valor
"b", mas corresponder "aabbaa" com /^(aa(bb)?)+$/ deixa $2
indefinido. No entanto, se a expressão for alterada para
/^(aa(b(b))?)+$/ então $2 (e $3) serão definidos.
No Perl 5.004, $2 é definido em ambos os casos, e isso também é
true
na PCRE. Se no futuro o Perl mudar para um estado consistente diferente, a PCRE poderá mudar para seguir o mesmo comportamento. - Outra discrepância ainda não resolvida é que no Perl 5.005_02 o padrão /^(a)?(?(1)a|b)+$/ corresponde à string "a", enquanto que na PCRE isso não acontece. No entanto, tanto no Perl quanto na PCRE, /^(a)?a/ correspondido com "a" deixa $1 indefinido.
-
PCRE fornece algumas extensões para os recursos de expressão regular Perl:
- Embora as afirmações retroativas devam corresponder a strings de comprimento fixo, cada ramificação alternativa de uma afirmação retroativa pode corresponder a um comprimento diferente de string. O Perl 5.005 exige que todas tenham o mesmo comprimento.
- Se PCRE_DOLLAR_ENDONLY estiver definida e PCRE_MULTILINE não estiver definida, o metacaractere $ corresponderá apenas ao final da string.
- Se PCRE_EXTRA estiver definida, uma barra invertida seguida por uma letra sem significado especial será uma falha.
- Se PCRE_UNGREEDY estiver definida, a ganância dos quantificadores de repetição é invertida, ou seja, por padrão eles não serão gananciosos, mas se seguidos de um ponto de interrogação eles serão.