webentwicklung-frage-antwort-db.com.de

String replaceAll () - Methode und Escape-Zeichen

Die Linie

System.out.println("\\");

druckt einen einzelnen Schrägstrich (\). Und

System.out.println("\\\\");

druckt doppelte Schrägstriche (\\). Verstanden!

Warum aber im folgenden Code:

class ReplaceTest
{
    public static void main(String[] args)
    {
        String s = "hello.world";
        s = s.replaceAll("\\.", "\\\\");
        System.out.println(s);
    }
}

ist die Ausgabe:

hello\world

anstatt

hello\\world

Schließlich ersetzt die replaceAll()-Methode einen Punkt (\\.) durch (\\\\).

Kann jemand das bitte erklären?

21
WickeD

Wenn Sie Zeichen mit regulären Ausdrücken ersetzen, können Sie Rückreferenzen verwenden, z. B. \1, um eine Verwendung einer Gruppe innerhalb der Übereinstimmung zu ersetzen.

Dies bedeutet jedoch, dass der Backslash ein Sonderzeichen ist. Wenn Sie also einen Backslash verwenden möchten, muss dieses Escapezeichen verwendet werden.

Das bedeutet, dass es zweimal verwendet werden muss, wenn es in einem Java-String verwendet wird. (Zuerst für den String-Parser, dann für den Regex-Parser.)

23
Reverend Gonzo

Der Javadoc von replaceAll sagt:

Beachten Sie, dass Backslashes (\) und Dollarzeichen ($) in der Ersetzung string kann dazu führen, dass die Ergebnisse anders sind als wenn als wörtliche Ersetzungszeichenfolge behandelt; Siehe Matcher.replaceAll. Benutzen Matcher.quoteReplacement (Java.lang.String), um das spezielle .__ zu unterdrücken. Bedeutung dieser Zeichen, falls gewünscht.

14
JB Nizet

Wenn Sie keinen Regex zum Ersetzen benötigen und nur genaue Zeichenfolgen ersetzen müssen, sollten Sie Regex-Steuerzeichen vor dem Ersetzen mit Escapezeichen versehen

String trickyString = "$Ha!I'm tricky|.|";
String safeToUseInReplaceAllString = Pattern.quote(trickyString);
4
Gorky

Dies ist ein formatierter Nachtrag zu meinem Kommentar 

s = s.replaceAll("\\.", Matcher.quoteReplacement("\\"));  

IST MEHR LESBAR UND BEDEUTEND 

s = s.replaceAll("\\.", "\\\\\\");
3
Christophe Blin

Ich mag diese Implementierung von Regex nicht. Wir sollten in der Lage sein, Zeichen mit einem einzelnen '\' und nicht mit '\' zu schützen. Aber wenn Sie THIS.Out_Of_Das bekommen wollen, können Sie folgendes tun:

String prefix = role.replaceFirst("(\\.).*", "");

Sie erhalten also das Präfix = THIS;

0
cepix

Ich glaube, in diesem speziellen Fall wäre es einfacher, Ersetzen anstelle von Ersetzen aller zu verwenden. Reverend Gonzo Hat die richtige Antwort, wenn er davon spricht, der Figur zu entkommen.

ReplaceAll verwenden:

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

Verwenden Sie ersetzen:

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

replace ersetzt nur einen passenden String, keinen regulären Ausdruck. 

0
Bogoth

Der Backslash ist ein Escape-Zeichen in Java-Strings. z.B. Backslash hat in Java eine vordefinierte Bedeutung. Sie müssen "\" verwenden, um einen einzelnen Backslash zu definieren. Wenn Sie "\ w" definieren wollen, müssen Sie "\\w" in Ihrer Regex verwenden. Wenn Sie den Backslash als Literal verwenden möchten, müssen Sie\\\\\eingeben, da\in regulären Ausdrücken auch ein Escape-Zeichen ist. 

0
David Mathias