Estoy buscando un regex
patrón que coincida con la tercera, cuarta, ... aparición de cada personaje. Mire abajo para aclaraciones:
Por ejemplo, tengo la siguiente cadena:
111aabbccxccybbzaa1
Quiero reemplazar todos los caracteres duplicados después de la segunda aparición. El resultado será:
11-aabbccx--y--z---
Algunos patrones de expresiones regulares que probé hasta ahora:
Usando la siguiente expresión regular puedo encontrar la última aparición de cada carácter: (.)(?=.*\1)
O usando este, puedo hacerlo por duplicados consecutivos pero no por duplicados: ([a-zA-Z1-9])\1{2,}
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
expresiones regulares. Demostración .
(.)(?<=(.*\1){3})
?
(.)(?<=(?:.*\1){3})
también hará el trabajo, pero todo esto no es bueno ya que el retroceso excesivo puede causar problemas con cadenas más largas. Prefiero escribir un método no regex para resolver el problema.
(.)(?<=(?:.*\1){3})
, (.)(?<=(?:\1.*?){2}\1)
3ms. Puedes ponerte a prueba. El tuyo parece ser el patrón menos eficiente y es el más difícil de leer.