EMZETT.
Login

Special Characters

Kurz: Zeichen in einem String-Literal, die eine besondere Bedeutung haben und deshalb mit einem Backslash “escaped” werden müssen — z. B. \n (Zeilenumbruch), \t (Tabulator), \" (Anführungszeichen im String).

Genauer: Ohne Escaping wäre z. B. ein Anführungszeichen innerhalb eines Strings nicht von dessen Ende zu unterscheiden: "Er sagte \"Hallo\"". Ein wörtlicher Backslash braucht ebenfalls ein Escaping (\\), da ein einzelner Backslash sonst als Beginn einer Escape-Sequenz interpretiert wird.

Im Detail

System.out.println("Zeile 1\nZeile 2");        // Zeilenumbruch
System.out.println("Name\tAlter");              // Tabulator
System.out.println("Er sagte \"Hallo\"");       // Anführungszeichen im String
System.out.println("C:\\Nutzer\\Dokument.txt"); // wörtlicher Backslash
System.out.println("Unicode: \u00e4");          // ä über Unicode-Escape

Die wichtigsten Escape-Sequenzen in Java: \n (Zeilenumbruch), \t (Tabulator), \" (doppeltes Anführungszeichen), \' (einfaches Anführungszeichen), \\ (Backslash) und \uXXXX (ein beliebiges Unicode-Zeichen über seinen vierstelligen Hex-Code). Seit Java 15 gibt es zusätzlich Text-Blöcke ("""..."""), die mehrzeiligen Text ohne \n-Escapes und ohne Escaping von normalen Anführungszeichen erlauben — praktisch für eingebettetes HTML, JSON oder SQL direkt im Code:

String html = """
    <html>
        <body>Hallo</body>
    </html>
    """;

Ein häufiger Anfängerfehler: einen Dateipfad unter Windows als "C:\Nutzer\Dokument.txt" zu schreiben — der Compiler interpretiert \N, \D als ungültige Escape-Sequenzen und meldet einen Fehler, weil jeder einzelne Backslash verdoppelt werden muss.

Weitere Escape-Sequenzen

Neben den gebräuchlichen gibt es noch \b (Backspace), \f (Seitenvorschub, heute praktisch ungenutzt), \r (Wagenrücklauf — unter Windows zusammen mit \n als Zeilenende üblich) und \0 (Null-Zeichen). Ein Zeilenumbruch, der auf allen Betriebssystemen korrekt aussieht, wird deshalb oft nicht als \n fest verdrahtet, sondern über System.lineSeparator() bezogen, da Windows intern \r\n erwartet, Unix-artige Systeme nur \n.

Escaping in RegEx vs. Strings — zwei Ebenen gleichzeitig

Ein besonders verwirrender Fall entsteht, wenn ein regulärer Ausdruck als String-Literal geschrieben wird: RegEx hat SEIN EIGENES Escaping (z. B. \d für eine Ziffer, \. für einen wörtlichen Punkt), das UNABHÄNGIG vom String-Escaping der Java-Syntax existiert. Ein Punkt, der in einem RegEx wörtlich gemeint ist, muss deshalb doppelt escaped werden — einmal für Java, einmal für die RegEx-Engine:

String pattern = "\\d+\\.\\d+"; // Java-String: \d+\.\d+ | RegEx: eine Zahl mit Dezimalpunkt
boolean istZahl = "3.14".matches(pattern); // true

Seit Java 15 helfen Text-Blöcke genau hier: Da sie normale Anführungszeichen nicht escapen müssen, bleibt zumindest diese eine Ebene der Verschachtelung weg, auch wenn \d weiterhin die RegEx-eigene Bedeutung behält.

Siehe auch: Strings, RegEx