String.replaceAll ohne RegEx

115

Ich möchte alle Instanzen eines Teilstrings in einer Zeichenfolge ersetzen, String.replaceAll()akzeptiert jedoch nur ein Muster. Die Saite, die ich aus einem früheren Spiel stammt. Ist es möglich, dem Muster, das ich habe, Escapezeichen hinzuzufügen, oder gibt es eine Version replaceAll()in einer anderen Klasse, die eine Literalzeichenfolge anstelle eines Musters akzeptiert?

Dromodell
quelle
Mögliches Duplikat des Backslash-Problems mit String.replaceAll
McDowell

Antworten:

189

Verwenden Sie einfach String.replace(CharSequence,CharSequence)eher als replaceAll.

Jon Skeet
quelle
13
Dies ersetzt nicht nur die erste? Seltsam, sie nannten es "replaceAll" anstelle von "replaceRegex".
Magic Octopus Urn
6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));kehrt zurück "hi world, hi life, hi you".
Thiago Mata
14
@MagicOctopusUrn: Ja, ich stimme zu, dass die Benennung sehr schlecht war - sie hat im Laufe der Zeit viel Verwirrung gestiftet.
Jon Skeet
sehr schlechte Benennung der Methoden. Warum machen sie (Sonne / Orakel) einfache Dinge kompliziert
Stunner
93

Das Verfahren entweicht hinzuzufügen ist Pattern.quote().

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

Aber wie Jon sagt, kannst du es einfach benutzen replace(). Trotz der Tatsache, dass es vom replaceAllNamen abweicht , ersetzt es alle Vorkommen genauso wie replaceAll().

Mark Peters
quelle
Funktioniert perfekt, wenn Sie beispielsweise "$" in Ihrem MatchingStr haben.
Julien Lafont
eher Pattern.compile (); Pattern.quote () bringt unerwünschte Ergebnisse
Pavlo Zvarych
@PavloZvarych: Pattern.compile()Kompiliert die Zeichenfolge als regulären Ausdruck, dh die Sonderzeichen erhalten die Sonderbedeutung. Das ist das genaue Gegenteil von dem Pattern.quote(), was das OP verlangt und verlangt ( quote()sagt: "Behandle den String als Literal"). Vielleicht könnten Sie näher darauf eingehen, von welchen "unerwünschten Ergebnissen" Sie sprechen.
Mark Peters
@ MarkPeters es war so etwas wie \\ G1 \\ G für "$ 1"
Pavlo Zvarych
1
@PavloZvarych: Wenn Sie versuchen, den Ersatz (und nicht das Suchmuster) zu zitieren, möchten Sie verwenden Matcher.quoteReplacement("$aa +"). Pattern.compile()produziert ein Pattern, nicht ein String, daher ist mir unklar, wie Sie es überhaupt verwenden replaceAll.
Mark Peters