Estoy dividiendo una cadena por un delimitador repetible, y también tengo la intención de mantener los delimitadores.
val str = "xxoooooooxxoxoxooooo" val reg = Regex("(?<=x+)|(?=x+)") var list = str.split(reg) println(list) La salida es [, x, x, ooooooo, x, x, o, x, o, x, ooooo] , aunque me gustaría obtener
[xx, ooooooo, xx, o, x, o, x, ooooo]
val str = "xxoooooooxxoxoxooooo" val reg = Regex("o+|x+").findAll(str).map { it.value }.toList() println(reg) //[xx, ooooooo, xx, o, x, o, x, ooooo]En realidad, no es correcto usar el cuantificador + dentro de un lookbehind en los patrones de expresiones regulares de Java, esta no es una función compatible documentada. No arroja una excepción porque internamente se traduce a {1,0x7FFFFFFF} y la expresión regular de Java admite patrones de búsqueda retroactiva de ancho restringido. Sin embargo, este cuantificador tanto en la búsqueda posterior como en la búsqueda anticipada no hace ninguna diferencia, ya que estos son patrones que no consumen, y el motor de expresiones regulares aún verifica cada posición dentro de una cadena en busca de una coincidencia de patrón.
Puedes usar
(?<=x)(?=o)|(?<=o)(?=x)Vea una demostración de Kotlin :
val str = "xxoooooooxxoxoxooooo" val reg = Regex("(?<=x)(?=o)|(?<=o)(?=x)") var list = str.split(reg) println(list) // => [xx, ooooooo, xx, o, x, o, x, ooooo]