Digamos que tiene la siguiente cadena:Sustitución de múltiples subcadenas en Java cuando el texto de reemplazo se superpone texto de búsqueda
cat dog fish dog fish cat
Desea reemplazar todas cats
con dogs
, todo dogs
con fish
, y todos fish
con cats
. Intuitivamente, el resultado esperado:
dog fish cat fish cat dog
Si se intenta la solución obvia, recorriendo con replaceAll()
, se obtiene:
- (el original)
cat dog fish dog fish cat
- (CAT -> perro)
dog dog fish dog fish dog
- (perro -> pescado)
fish fish fish fish fish fish
- (pescado -> gato)
cat cat cat cat cat cat
Claramente, este no es el resultado esperado. Entonces, ¿cuál es la forma más sencilla de hacer esto? Puedo improvisar algo junto con Pattern
y Matcher
(y un montón de Pattern.quote()
y Matcher.quoteReplacement()
), pero me niego a creer que soy la primera persona en tener este problema y no hay una función de biblioteca para resolverlo.
(Fwiw, el caso real es un poco más complicado y no implica permutas rectas.)
Esto parece estar explícitamente prohibido, al menos en StringUtils 2.5 y versiones anteriores: "Lanza: IllegalArgumentException - si la búsqueda se repite y hay un bucle sin fin debido a que las salidas de una son entradas a otra". (Aunque lo que en realidad obtengo es una IllegalStateException ya que la recursión no se detiene correctamente.) –
Estoy confundido. El método que cito arriba (que copié directamente de los javadocs en línea) ni siquiera existe. No hay replaceEach con el último parámetro booleano. Por otro lado 'StringUtils.replaceEach (" abcde ", new String [] {" ab "," cd "}, new String [] {" cd "," ab "})' devuelve '" cdabe "' que parece ser correcto. Lo comprobé en 2.5 –
Ok, algo de claridad. 'replaceEachRepeatedly' arroja' IllegalStateException' como usted escribió. 'replaceEach' con el último parámetro' boolean' no existe. 'replaceEach' sin el último parámetro' boolean' parece hacer el trabajo. –