String.replaceAll sem RegEx

115

Eu gostaria de substituir todas as instâncias de uma substring em uma string, mas String.replaceAll()só aceita um padrão. A string que recebi de uma partida anterior. É possível adicionar escapes ao padrão que tenho ou existe uma versão replaceAll()em outra classe que aceita uma string literal em vez de um padrão?

dromodelo
fonte
possível duplicata do problema
McDowell

Respostas:

189

Basta usar em String.replace(CharSequence,CharSequence)vez de replaceAll.

Jon Skeet
fonte
13
Isso não substitui apenas o primeiro? Estranho, eles chamaram de "replaceAll" em vez de "replaceRegex".
Magic Octopus Urn
6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));retorna "hi world, hi life, hi you".
Thiago Mata
14
@MagicOctopusUrn: Sim, concordo que foi uma nomenclatura muito ruim - causou muita confusão ao longo do tempo.
Jon Skeet
péssima nomenclatura dos métodos. Por que eles (sol / oráculo) tornam as coisas simples complicadas
Stunner
93

O método para adicionar escapes é Pattern.quote().

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

Mas, como diz Jon, você pode simplesmente usar replace(). Apesar de divergir do replaceAllnome, ele substitui todas as ocorrências exatamente como replaceAll().

Mark Peters
fonte
Funciona perfeitamente se você tiver um "$" em sua String correspondente, por exemplo.
Julien Lafont
em vez de Pattern.compile (); Pattern.quote () traz resultados indesejáveis
Pavlo Zvarych
@PavloZvarych: Pattern.compile()compila a string como uma expressão regular, o que significa que os caracteres especiais terão um significado especial. Isso é o completo oposto do que Pattern.quote()faz e do que o OP estava pedindo ( quote()diz "trate a string como um literal"). Talvez você possa expandir os "resultados indesejáveis" de que está falando.
Mark Peters
@MarkPeters era algo como \\ G1 \\ G para "$ 1"
Pavlo Zvarych
1
@PavloZvarych: Se você está tentando citar a substituição (e não o padrão de pesquisa), você deseja usar Matcher.quoteReplacement("$aa +"). Pattern.compile()produz um Pattern, não um String, então não está claro para mim como você o está usando em replaceAll.
Mark Peters