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?


possível duplicata do problema
McDowell

Respostas:


189

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


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().


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.