webentwicklung-frage-antwort-db.com.de

Schrägstrich in Java Regex

Ich kann nicht herausfinden, warum der folgende Code sich nicht wie erwartet verhält

"Hello/You/There".replaceAll("/", "\\/");
  • Erwartete Ausgabe: Hello\/You\/There
  • Aktuelle Ausgabe: Hello/You/There

Muss ich den Schrägstrichen entkommen? Ich glaubte es nicht, aber ich versuchte es auch gegen meinen Willen ... es funktionierte nicht

"Hello/You/There".replaceAll("\\/", "\\/");

Am Ende wurde mir klar, dass ich keinen regulären Ausdruck brauche und ich kann einfach das Folgende verwenden, das keinen regulären Ausdruck erzeugt

"Hello/You/There".replace("/", "\\/");

Ich möchte jedoch immer noch verstehen, warum mein erstes Beispiel nicht funktioniert.

47
Juan Mendes

Das Problem ist eigentlich, dass Sie backslashes in der Ersetzungszeichenfolge doppelt zwischenspeichern müssen. Sie sehen, "\\/" (wie ich sicher weiß, dass Sie es wissen) bedeutet, dass die Ersetzungszeichenfolge \/ ist, und (wie Sie wahrscheinlich nicht wissen) die Ersetzungszeichenfolge \/ tatsächlich nur / einfügt, da Java komisch ist und \ eine besondere Bedeutung gibt in der Ersatzzeichenfolge. (Es ist angeblich so, dass \$ ein buchstäbliches Dollarzeichen ist, aber ich denke, der wahre Grund ist, dass sie sich mit Leuten herumspielen wollten. Andere Sprachen machen das nicht so.) Sie müssen also entweder schreiben:

"Hello/You/There".replaceAll("/", "\\\\/");

oder:

"Hello/You/There".replaceAll("/", Matcher.quoteReplacement("\\/"));

(Verwenden von Java.util.regex.Matcher.quoteReplacement(String) .)

73
ruakh

Doppelter Escaping ist erforderlich, wenn er als Zeichenfolge dargestellt wird. 

Immer wenn ich einen neuen regulären Ausdruck mache, mache ich eine Reihe von Tests mit Online-Tools, zum Beispiel: http://www.regexplanet.com/advanced/Java/index.html

Auf dieser Website können Sie den regulären Ausdruck eingeben, der dann in eine Zeichenfolge umgewandelt wird. Anschließend können Sie ihn mit verschiedenen Eingaben testen.

1
James Oravec

Es gibt eigentlich einen Grund, warum all diese Dinge durcheinander gebracht werden. In diesem Thread wird etwas tiefer gegraben, was hilfreich sein kann, um zu verstehen, warum "\\" sich so verhält.

0
coder91