Reemplazar múltiples subcadenas en Java cuando el texto de reemplazo se superpone al texto de búsqueda

Di que tienes la siguiente cadena:

cat dog fish dog fish cat

Quieres reemplazar todoscats condogs, todosdogs confish, y todofish concats. Intuitivamente, el resultado esperado:

dog fish cat fish cat dog

Si prueba la solución obvia, realice un bucle conreplaceAll(), usted obtiene

(original)cat dog fish dog fish cat (gato -> perro)dog dog fish dog fish dog (perro -> pescado)fish fish fish fish fish fish (pez -> gato)cat cat cat cat cat cat

Claramente, este no es el resultado deseado. Entonces, ¿cuál es la forma más sencilla de hacer esto? Puedo improvisar algo junto conPattern yMatcher (y un montón dePattern.quote() yMatcher.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 intercambios directos).

Respuestas a la pregunta(5)

Su respuesta a la pregunta