String.replaceAll sans RegEx

115

Je voudrais remplacer toutes les instances d'une sous-chaîne dans une chaîne mais String.replaceAll()n'accepte qu'un modèle. La chaîne que j'ai issue d'un match précédent. Est-il possible d'ajouter des échappements au modèle que j'ai ou existe-t-il une version de replaceAll()dans une autre classe qui accepte une chaîne littérale au lieu d'un modèle?

dromodel
la source

Réponses:

189

Utilisez simplement String.replace(CharSequence,CharSequence)plutôt que replaceAll.

Jon Skeet
la source
13
Cela ne remplace pas seulement le premier? Bizarre, ils l'ont appelé "replaceAll" au lieu de "replaceRegex".
Urne de poulpe magique
6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));revient "hi world, hi life, hi you".
Thiago Mata
14
@MagicOctopusUrn: Oui, je suis d'accord que la dénomination était très mauvaise - cela a causé beaucoup de confusion avec le temps.
Jon Skeet
très mauvaise dénomination des méthodes. Pourquoi (soleil / oracle) rendent-ils les choses simples compliquées
Stunner
93

La méthode pour ajouter des échappements est Pattern.quote().

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

Mais comme Jon le dit, vous pouvez simplement utiliser replace(). Malgré le fait qu'il s'écarte du replaceAllnom, il remplace toutes les occurrences comme replaceAll().

Mark Peters
la source
Fonctionne parfaitement si vous avez un "$" dans votre matchingStr par exemple.
Julien Lafont
plutôt Pattern.compile (); Pattern.quote () apporte des résultats indésirables
Pavlo Zvarych
@PavloZvarych: Pattern.compile()compile la chaîne en tant qu'expression régulière, ce qui signifie que les caractères spéciaux auront une signification particulière. C'est tout le contraire de ce que Pattern.quote()fait, et de ce que l'OP demandait ( quote()dit, "traiter la chaîne comme un littéral"). Peut-être pourriez-vous expliquer de quels «résultats indésirables» vous parlez.
Mark Peters
@MarkPeters c'était quelque chose comme \\ G1 \\ G pour "$ 1"
Pavlo Zvarych
1
@PavloZvarych: Si vous essayez de citer le remplacement (et non le modèle de recherche), vous souhaitez utiliser Matcher.quoteReplacement("$aa +"). Pattern.compile()produit un Pattern, pas un String, donc je ne sais pas comment vous l'utilisez replaceAll.
Mark Peters