Werfen wir einen Rundgang durch String#repalceAll(String regex, String replacement)
Sie, dass sehen:
Ein Aufruf dieser Methode des Formulars str.replaceAll (regex, repl) liefert genau das gleiche Ergebnis wie die
Ausdruck
Pattern.compile(regex).matcher(str).replaceAll(repl)
So kann bei Matcher.html#replaceAll(java.lang.String) Dokumentation einen Blick
Beachten Sie, dass Schrägstriche (\
) und Dollar-Zeichen ($
) in der Ersatzzeichenfolge verursachen können die Ergebnisse anders zu sein, als wenn es als ein wörtlichen Ersatz-String behandelt wurde. Dollarzeichen können als Verweise auf erfasste Untersequenzen behandelt werden, wie oben beschrieben, und Backslashes werden verwendet, um Literalzeichen in der Ersetzungszeichenfolge zu umgehen.
können Sie sehen, dass in replacement
wir haben Sonderzeichen $
, die als Hinweis auf erfassten Gruppe verwendet werden können, wie
System.out.println("aHellob,aWorldb".replaceAll("a(\\w+?)b", "$1"));
// result Hello,World
Aber manchmal haben wir nicht $
so Besonderes sein wollen, weil wir wollen benutze es als einfachen Dollar-Charakter, also brauchen wir einen Weg, um ihm zu entkommen.
Und hier kommt \
, denn da es verwendet wird, um Metazeichen in Regex, Strings und wahrscheinlich an anderen Orten zu entkommen, ist es gute Konvention, es hier zu verwenden, um $
zu entkommen.
So jetzt \
ist auch Metazeichen in Teil ersetzen, also wenn Sie es einfach \
literal Ersatz machen wollen, müssen Sie es irgendwie entkommen. Und rate was? Sie entkommen es auf die gleiche Weise, wie Sie es in Regex oder String entkommen. Sie müssen nur einen anderen \
vor einem Sie entkommen.
Also, wenn Sie \
in Ersatzteil erstellen möchten, benötigen Sie eine andere \
bevor es hinzuzufügen. Aber denken Sie daran, dass zum Schreiben \
Literal in String Sie es als "\\"
schreiben müssen, um zwei \\
als Ersatz zu erstellen, müssen Sie es als "\\\\"
schreiben.
So versuchen
s = s.replaceAll("'", "\\\\'");
oder noch besser, explizit zu reduzieren Ersatzteil zu entkommen (und auch in regex Teil - vergessen zu, dass bereits erwähnt) nur replace
anstelle replaceAll
, die für uns zu entkommen fügen
s = s.replace("'", "\\'");
möglich Duplikat [replace() und replaceAll() in Java] (http://stackoverflow.com/questions/12941266/replace-and-replaceall-in-java) – user2864740
Wenn Sie dies noch nicht berücksichtigt haben und die Eingabe von einem Benutzer stammt, möchten Sie vielleicht auch alle umgekehrten Schrägstriche durch doppelte umgekehrte Schrägstriche ersetzen.Wenn der Benutzer zum Beispiel "You're 'awesome' \ 'amazing" "' eingibt, erhält man momentan "" Sie sind \' awesome \ '\' amazing \ '"'. Dadurch bleibt das dritte Zitat unbemerkt, weil der vom Benutzer eingegebene umgekehrte Schrägstrich den generierten Backslack hinter ihm verdeckt! – tobii