Diferencias con Perl
Las diferencias descritas aquí se refieren a las que hay con Perl 5.005.
-
Por defecto, un carácter espacio en blanco es cualquier carácter que
la función isspace() de la biblioteca C reconoce, aunque es
posible compilar PCRE con tablas de tipo de caracteres alternativas.
Normalmente isspace() coincide con un espacio, salto de página, nueva línea,
retorno de carro, tabulador horizontal y tabulador vertical. Perl 5 ya
no incluye el tabulador vertical en su juego caracteres de espacios en blanco.
De hecho, el carácter de escape \v, el cual estuvo en la documentación de Perl
durante mucho tiempo, nunca fue reconocido. Sin embargo, el carácter
mismo fue tratado como espacio en blanco al menos hasta 5.002.
En 5.004 y 5.005 no coincide con \s.
-
PCRE no permite los cuantificadores de repetición en declaraciones
de búsqueda hacia delante. Perl las permite, pero no significan lo que
se puede estar pensando. Por ejemplo, (?!a){3} no afirma que los
tres caracteres siguientes no son "a". Simplemente afirma que el
siguiente carácter no es "a" tres veces.
-
Los sub-patrones de captura que tienen lugar dentro de declaraciones
de búsqueda hacia delante negativas se cuentan, pero sus entradas en los
índices del vector nunca se establecen. Perl establece sus variables
numéricas desde cualquiera de los patrones que han coincidido antes de que
la declaración falle al coincidir con algo (de ese modo teniendo éxito), pero
sólo si la declaración de búsqueda hacia delante negativa contiene sólo una rama.
-
Aunque los caracteres cero binario están soportados en la cadena objetivo,
no están permitidos en un patrón de cadena porque es pasado como una
cadena C normal, finalizada por cero. La secuencia de escape "\x00" se puede
usar para representar un cero binario en un patrón.
-
Las siguientes secuencias de escape de Perl no estás soportadas:
\l, \u, \L, \U. De hecho, éstas están implementadas por
el manejo de cadenas general de Perl y no son parte de su motor de
comparación de patrones.
-
La declaración \G de Perl no está soportada y no es
relevante para las comparaciones de patrones individuales.
-
Obviamente, PCRE no soporta la construcción de (?{código}) y
(??{código}). Sin embargo, tiene soporte para patrones recursivos.
-
Hay, a la hora de escribir, algunas singularidades en Perl
5.005_02 concernientes con la configuración de las cadenas capturadas
cuando una parte de un patrón se repite. Por ejemplo, al comparar
"aba" con el patrón /^(a(b)?)+$/ establece $2 con el valor
"b", pero al comparar "aabbaa" con /^(aa(bb)?)+$/ deja $2
sin establecer. Sin embargo, si el patrón se cambia a
/^(aa(b(b))?)+$/ entonces $2 (y $3) se establecen.
En Perl 5.004 $2 es establecido en ambos casos, y esto también es
true
en PCRE. Si en el futuro Perl cambia a un estado de consistencia que es
diferente, PCRE puede cambiar para seguir su ejemplo.
-
Una discrepancia todavía no resuelta es que en Perl
5.005_02 el patrón /^(a)?(?(1)a|b)+$/ coincide con la cadena
"a", mientras que en PCRE no lo hace. Sin embargo, en Perl y en
PCRE /^(a)?a/ coincide con "a" dejando $1 sin establecer.
-
PCRE proporciona algunas extensiones para las herramientas de expresiones
regulares de Perl:
-
Aunque las declaraciones de búsqueda hacia atrás deben coincidir con cadenas de
longitud fija, cada rama alternativa de una declaración de búsqueda hacia atrás
puede coincidir con una longitud de cadena diferente. Perl 5.005 requiere que
todas ellas tengan la misma longitud.
-
Si se aplica PCRE_DOLLAR_ENDONLY
y no se aplica PCRE_MULTILINE,
el meta-carácter $ coincide sólo con el final absoluto de la cadena.
-
Si se aplica PCRE_EXTRA,
una barra invertida seguida de una letra sin ningún significado especial fallará.
-
Si se aplica PCRE_UNGREEDY,
la codicia de los cuantificadores de repetición se invierte,
es decir, por defecto dejan de ser codiciosos, pero si son seguidos por un
signo de interrogación lo serán.