Regular Expressions
Recursion
Buscar..
Observaciones
La recursión está disponible principalmente en sabores compatibles con Perl, tales como:
- Perl
- PCRE
- Oniguruma
- Aumentar
Repetir todo el patrón
La construcción (?R)
es equivalente a (?0)
(o \g<0>
) - te permite repetir todo el patrón:
<(?>[^<>]+|(?R))+>
Esto hará coincidir los corchetes angulares correctamente equilibrados con cualquier texto entre los corchetes, como <a<b>c<d>e>
.
Reclamar en un subpatrón
Puede recurrir a un subpatrón usando las siguientes construcciones (según el tipo), asumiendo que n
es un número de grupo de captura y name
el nombre de un grupo de captura.
-
(?n)
-
\g<n>
-
\g'0'
-
(?&name)
-
\g<name>
-
\g'name'
-
(?P>name)
El siguiente patrón:
\[(?<angle><(?&angle)*+>)*\]
Coincidirá con el texto como: [<<><>><>]
- corchetes angulares bien equilibrados entre corchetes. La recursión se utiliza a menudo para la construcción equilibrada de construcciones.
Definiciones de subpattern
La construcción (?(DEFINE)
... )
permite definir subpatrones a los que puede hacer referencia más adelante mediante recursión. Cuando se encuentre en el patrón, no se comparará con.
Este grupo debe contener definiciones de subpatrones con nombre, a las que solo se podrá acceder mediante recursión. Puedes definir las gramáticas de esta manera:
(?x) # ignore pattern whitespace
(?(DEFINE)
(?<string> ".*?" )
(?<number> \d+ )
(?<value>
\s* (?:
(?&string)
| (?&number)
| (?&list)
) \s*
)
(?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$
Este patrón validará texto como el siguiente:
[42, "abc", ["foo", "bar"], 10]
Observe cómo una lista puede contener uno o más valores, y un valor puede ser una lista.
Referencias de grupo relativas
Se puede hacer referencia a los subpatrones con su número de grupo relativo :
-
(?-1)
entrará en el grupo anterior -
(?+1)
retrocederá en el siguiente grupo
También se puede utilizar con la sintaxis \g<N>
.
Referencias en recursiones (PCRE)
En PCRE, los grupos emparejados utilizados para las referencias inversas antes de una recursión se mantienen en la recursión. Pero después de la recursión, todos se restablecen a lo que eran antes de entrar. En otras palabras, los grupos emparejados en la recursión son todos olvidados.
Por ejemplo:
(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}
partidos
aaabba
Las recursiones son atómicas (PCRE)
En PCRE, no hace un trackback después de que se encuentra la primera coincidencia para una recursión. Asi que
(?(DEFINE)(aaa|aa|a))(?1)ab
no coincide
aab
porque después de coincidir con aa
en la recursión, nunca volverá a intentar coincidir con solo a
.