¿Cómo funciona exactamente esta expresión regular recursiva?
Este es un seguimiento deesta pregunta.
Echa un vistazo a este patrón:
(o(?1)?o)
Coincide con cualquier secuencia deo
con una longitud de 2n, con n ≥ 1.
Funciona, ver regex101.com (Se agregaron límites de palabras para una mejor demostración).
La pregunta es:¿Por qué?
A continuación, la descripción de una cadena (coincidente o no) simplemente será un número en negrita o un término en negrita que describe la longitud, como2n.
Desglosado (con espacios en blanco añadidos):
( o (?1)? o )
( ) # Capture group 1
o o # Matches an o each at the start and the end of the group
# -> the pattern matches from the outside to the inside.
(?1)? # Again the regex of group 1, or nothing.
# -> Again one 'o' at the start and one at the end. Or nothing.
No entiendo por qué esto no coincide2n, pero2n, porque describiría el patrón como * un número indefinido deo o
, apilados uno dentro del otro.
Visualización:
Sin recursividad,2 es un partido:
oo
Una recursividad4 es un partido:
o o
oo
Hasta ahora, muy fácil.
Dos recursiones. Obviamente mal porque el patrón no coincide6:
o o
o o
oo
¿Pero por qué? Parece encajar en el patrón.
Concluyo que no es simplemente el patrón simple que se repite porque de lo contrario6 Tendría que coincidir.
Pero de acuerdo aregular-expressions.info:
(?P<name>[abc])(?1)(?P>name)
coincide con tres letras como(?P<name>[abc])[abc][abc]
hace.
y
[abc])(?1){3}
[...] es equivalente a([abc])[abc]{3}
Por lo tanto, parece simplemente rehacer el código regex sin una información sobre la coincidencia anterior del grupo de captura.
¿Alguien puede explicar y tal vez visualizar por qué este patrón coincide2n ¿y nada más?
Editar:
Fue mencionado en los comentarios:
Dudo que hacer referencia a un grupo de captura dentro de sí mismo sea realmente un caso compatible.
regular-expressions.info menciona la técnica:
Si realiza una llamada dentro del grupo al que llama, tendrá un grupo de captura recursivo.