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 .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow