¿Se pueden usar las referencias en un lookbehind?Backreferences en lookbehind
Digamos que quiero split
donde esté detrás de mí, un personaje se repite dos veces.
String REGEX1 = "(?<=(.)\\1)"; // DOESN'T WORK!
String REGEX2 = "(?<=(?=(.)\\1)..)"; // WORKS!
System.out.println(java.util.Arrays.toString(
"Bazooka killed the poor aardvark (yummy!)"
.split(REGEX2)
)); // prints "[Bazoo, ka kill, ed the poo, r aa, rdvark (yumm, y!)]"
Usando REGEX2
(donde la referencia inversa se encuentra en una búsqueda hacia delante anidado dentro de una búsqueda hacia atrás) funciona, pero REGEX1
da este error en tiempo de ejecución:
Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
^
Este tipo de tiene sentido, me supongamos, porque en general la referencia inversa puede capturar una cadena de cualquier longitud (si el compilador de expresiones regulares es un poco más inteligente, podría determinar que \1
es (.)
en este caso, y por lo tanto tiene una longitud finita).
Entonces, ¿hay alguna manera de utilizar una referencia inversa en un lookbehind?
Y si no lo hay, ¿siempre se puede evitar usar esta búsqueda anidada? ¿Hay otras técnicas comúnmente usadas?
Interesante y +1 por su ingeniosa solución. No uso Java, por lo que no puedo probarlo, ¿qué sucede si el grupo referenciado está fuera de la apariencia, como '(? <= \\ 1) (.)'? –
@Tim: resulta esencialmente el mismo 'PatternSyntaxException'. Por cierto, si alguien quiere jugar con una variante de este problema, acabo de escribir uno en codingBat: http://codingbat.com/prob/p266235 – polygenelubricants
@polygenelubricants Desearía poder votar mejor esta expresión regular: (? <= (? = (.) \\ 1) ..) por lo menos 10 veces. ¡muy elegante! – Eugene