Patrones recursivos
Considere el problema de hacer coincidir una cadena entre paréntesis,
permitiendo paréntesis anidados ilimitados. Sin el uso
de recursión, lo mejor que se puede hacer es usar un patrón
que coincide hasta una profundidad fija de anidamiento. No
es posible manejar una profundidad de anidamiento arbitraria. Perl 5.6 ha
proporcionado una instalación experimental que permite que las expresiones regulares sean recursivas (entre otras cosas). Se proporciona el elemento especial (?R) para el caso específico de recursión.
Este patrón PCRE resuelve el problema de los paréntesis (asumiendo
que la opción PCRE_EXTENDED está establecida para que el espacio en blanco se
ignore):
\( ( (?>[^()]+) | (?R) )* \)
Primero coincide con un paréntesis de apertura. Luego coincide con cualquier
número de subcadenas que pueden ser una secuencia de caracteres no paréntesis, o una coincidencia recursiva del patrón mismo (es decir, una subcadena correctamente entre paréntesis). Finalmente hay un paréntesis de cierre.
Este ejemplo de patrón en particular contiene repeticiones ilimitadas anidadas, y por lo tanto el uso de un subpatrón de una sola vez para coincidir con cadenas de caracteres no paréntesis es importante al aplicar
el patrón a cadenas que no coinciden. Por ejemplo, cuando se aplica a
(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
produce "no coincide" rápidamente. Sin embargo, si no se usa un subpatrón de una sola vez, la coincidencia tarda un tiempo muy largo
porque hay tantas formas diferentes en que las repeticiones + y * pueden dividir el sujeto, y todas tienen que ser probadas antes de que se pueda informar el fallo.
Los valores establecidos para cualquier subpatrón de captura son aquellos del nivel más externo de la recursión en el que se establece el valor del subpatrón. Si el patrón anterior coincide con
(ab(cd)ef)
el valor para los paréntesis de captura es "ef", que es el último valor tomado en el nivel superior. Si se añaden más paréntesis, dando
\( ( ( (?>[^()]+) | (?R) )* ) \)
entonces la cadena que capturan
es "ab(cd)ef", el contenido de los paréntesis de nivel superior. Si hay más de 15 paréntesis de captura en un patrón,
PCRE tiene que obtener memoria adicional para almacenar datos durante una
recursión, lo cual hace mediante el uso de pcre_malloc, liberándola posteriormente mediante pcre_free. Si no se puede obtener memoria, solo guarda datos para los primeros 15 subpatrones de captura, ya que no hay forma de dar un error de memoria insuficiente desde dentro de una recursión.
(?1)
, (?2)
y así sucesivamente pueden usarse para subpatrones recursivos también. También es posible usar subpatrones con nombre: (?P>name)
o
(?&name)
.
Si la sintaxis para una referencia de subpatrón recursivo (ya sea por número o por nombre) se usa fuera de los paréntesis a los que se refiere, opera como una subrutina en un lenguaje de programación. Un ejemplo anterior señaló que el patrón
(sens|respons)e and \1ibility
coincide con "sense and sensibility" y "response and responsibility", pero
no con "sense and responsibility". Si en su lugar se usa el patrón
(sens|respons)e and (?1)ibility
sí coincide con "sense and responsibility" además de las otras dos cadenas. Tales referencias deben, sin embargo, seguir al subpatrón al que se refieren.
La longitud máxima de una cadena de sujeto es el número positivo más grande
que puede contener una variable entera. Sin embargo, PCRE usa recursión para
manejar subpatrones y repetición indefinida. Esto significa que el espacio de pila disponible puede limitar el tamaño de una cadena de sujeto que puede ser
procesada por ciertos patrones.