2013-12-12 5 views
17

Ich brauche alle Zitate zu entkommen (‚) in einem String, so wird es \‘Java: Ersetzen Sie alle ‚in einer Zeichenkette mit ‘

Ich habe versucht, mit replaceAll, aber es tut nichts . Aus irgendeinem Grund kann ich die Regex nicht zum Laufen bringen.

Ich bin mit

String s = "You'll be totally awesome, I'm really terrible"; 
String shouldBecome = "You\'ll be totally awesome, I\'m really terrible"; 
s = s.replaceAll("'","\\'"); // Doesn't do anything 
s = s.replaceAll("\'","\\'"); // Doesn't do anything 
s = s.replaceAll("\\'","\\'"); // Doesn't do anything 

versuche ich wirklich hier bin stecken, hoffe mir jemand hier helfen kann.

Danke,

Iwan

+0

möglich Duplikat [replace() und replaceAll() in Java] (http://stackoverflow.com/questions/12941266/replace-and-replaceall-in-java) – user2864740

+0

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

Antwort

26

Sie müssen zuerst den Backslash entkommen, weil es sich um eine wörtliche (Nachgeben \\) ist, und es dann wieder entkommen, weil der reguläre Ausdruck (was \\\\). Also, versuchen Sie:

s.replaceAll("'", "\\\\'"); 

Ausgang:

You\'ll be totally awesome, I\'m really terrible 
+3

Matcher.quoteReplacement ("\\ '") kann verwendet werden, um die Ersetzungszeichenfolge anzugeben. – isnot2bad

+2

@ isnot2bad Ich glaube wirklich, dass die Verwendung von 'Matcher.quoteReplacement' fast eine Antwort selbst verdient. (Es ist 'quoteReplacement', nicht' quoteRegex' aus gutem Grund.) – user2864740

+0

@ user2864740, könnten Sie bitte ein wenig ausarbeiten. Ich habe es in Bezug auf die Ersatzfunktionszeichenfolge erklärt, da wir für diesen Fall nicht vier Backslash, sondern nur zwei als "Nambari" beantwortet hätten. – Sage

11

Verwenden replace()

s = s.replace("'", "\\'"); 

Ausgang:

Sie \ 'll total genial, I \' m wirklich schrecklich

+1

@BoristheSpider: replaceall() unterscheidet sich von replace(). Ich denke nicht, dass OP hier einen Regex braucht. – kosa

3

Dies sagt nicht, wie zu „reparieren“ das Problem - das ist bereits in anderen Antworten geschehen; Es besteht die Möglichkeit, die Details und die entsprechenden Dokumentationsreferenzen zu erstellen.


Wenn String.replaceAll oder jedes der anwendbaren Matcher Ersatzstoffe verwenden, achten Sie auf die Ersatzzeichenfolge und wie es behandelt wird:

Beachten Sie, dass Schrägstriche (\) und Dollar-Zeichen ($) in Die Ersetzungszeichenfolge kann dazu führen, dass die Ergebnisse anders sind, als wenn sie als Literal-Ersetzungszeichenfolge behandelt würden. Dollarzeichen können wie oben beschrieben als Verweise auf erfasste Untersequenzen behandelt werden, und Backslashes werden verwendet, um Literalzeichen in der Ersetzungszeichenfolge zu umgehen.

Wie von isnot2bad in einem Kommentar, kann Matcher.quoteReplacement hier nützlich sein:

Gibt einen wörtlichen Ersatz String für den angegebenen String. .. Die erzeugte Zeichenfolge entspricht der Zeichenfolge in s, die als Literalfolge behandelt wird. Schrägstriche (\) und Dollarzeichen ($) erhalten keine besondere Bedeutung.

8

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("'", "\\'"); 
Verwandte Themen