Substituir várias substrings em Java quando o texto de substituição se sobrepõe à pesquisa de texto

Diga que você tem a seguinte string:

cat dog fish dog fish cat

Você deseja substituir todos oscats comdogs, todosdogs comfish, e tudofish comcats. Intuitivamente, o resultado esperado:

dog fish cat fish cat dog

Se você tentar a solução óbvia, alternando comreplaceAll(), você obtém:

(original)cat dog fish dog fish cat (gato -> cachorro)dog dog fish dog fish dog (cachorro -> peixe)fish fish fish fish fish fish (peixe -> gato)cat cat cat cat cat cat

Claramente, este não é o resultado pretendido. Então, qual é a maneira mais simples de fazer isso? Posso fazer algo junto comPattern eMatcher (e um monte dePattern.quote() eMatcher.quoteReplacement()), mas me recuso a acreditar que sou a primeira pessoa a ter esse problema e não há função de biblioteca para resolvê-l

(FWIW, o caso atual é um pouco mais complicado e não envolve trocas diretas.)

questionAnswers(5)

yourAnswerToTheQuestion