Java Regular Expressions Frage zum Escapen

violentviper

Lt. Commander
Registriert
Mai 2008
Beiträge
1.690
Hallo,
ich habe eine kleine Frage zu den Regular Expressions unter Java. Und zwar verstehe ich das mit den Zeichen escapen nicht so ganz.

Es gibt ja die Zeichenklassen, welche als Abkürzung benutzt werden können. Z.B \d für eine Ziffer: [0-9] oder \w für ein Wort.

Wenn ich diese nun verwenden will, dann brauch ich aber immer zwei Backslashs damit es funktioniert. Das verstehe ich nicht so ganz, in den Anleitungen finde ich immer nur die oben erwähnte schreibweise.

Code:
System.out.println( Pattern.matches( "\d", "112" ) );  
// Bringt einen Fehler 

System.out.println( Pattern.matches( "\\d", "112" ) );  
//Bringt keinen Fehler

Warum brauch man hier zwei \\ ? Er mault sonst immer rum das es eine ungültige Escape Sequenz sei.
 
thecain schrieb:
das RegexPattern ist \d und ein \ muss halt escaped werden, also \\d

Ja und warum muss es "halt" escaped werden? Das verstehe ich nicht
 
thecain schrieb:
Das Zeichen \ hat eine spezielle bedeutung für den Compiler, damit er weiss, wenn \r kommt ist es ein Carriage Return und nicht "\r" als Text. \\ brauchst du dann, damit der Compiler weiss, dass du wirklich \ schreiben wolltest.
[/URL]
Das sehe ich auch so. Doch genau das verwirrt mich. Ich will das Backslash ja auch nicht mit als Text haben. Durch das \d benutze ich ja schon die bestimmte Compilerfunktion, sodass er hier doch schon wissen müsste das hier eine Zahl von 0-9 erwartet wird.
Und ich habe es getestet, im System.out.println meckert er immer bei Ausdrücken die mit Backslash anfangen, also kann man das "\x" gar nicht so ohne weiteres ausversehen ausdrucken.
 
http://www.regular-expressions.info/dotnet.html schrieb:
In literal C# strings, as well as in C++ and many other .NET languages, the backslash is an escape character. The literal string "\" is a single backslash. In regular expressions, the backslash is also an escape character. The regular expression \\ matches a single backslash. This regular expression as a C# string, becomes "\\\". That's right: 4 backslashes to match a single one.

The regex \w matches a word character. As a C# string, this is written as "\\w".
Gilt analog zu C/C++/Java/PHP/... \ ist ein Escape-Character. \\ ist ein Backslash.
 
Du mußt dir das quasi als 2 Schichten denken. Erst mal muß dein String-Literal durch den Java-Compiler durch. Für den Java-Compiler bedeutet "\\d" ein Backslash gefolgt von einem d. Nun hast du also eine Zeichenkette, die wirklich nur aus "\d" besteht, und das geht dann weiter an die regular expression engine.

P.S. Ein ähnliches Problem hat man manchmal, wenn man Argumente an ein Programm durchreichen will, bestimmte Zeichen, die in den Argumenten vorkommen, aber für die Shell, über die man geht, eine Sonderbedeutung haben. Dann muß man diese eben auch irgendwie escapen, damit diese nicht fälschlicherweise von der Shell als Sonderzeichen erkannt werden.
Ergänzung ()

Ich sehe gerade ( http://stackoverflow.com/questions/1256667/raw-strings-in-java-for-regex-in-particular ), dass es in Java einen besonderen Mechanismus gibt, der es erleichtert, Patterns für regexes zu basteln, weil man sich das lästige Escapen sparen kann:

Code:
Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));

(aus der Antwort des Users ismailsunni)
 
Zuletzt bearbeitet:
antred schrieb:
Du mußt dir das quasi als 2 Schichten denken. Erst mal muß dein String-Literal durch den Java-Compiler durch. Für den Java-Compiler bedeutet "\\d" ein Backslash gefolgt von einem d. Nun hast du also eine Zeichenkette, die wirklich nur aus "\d" besteht, und das geht dann weiter an die regular expression engine.

P.S. Ein ähnliches Problem hat man manchmal, wenn man Argumente an ein Programm durchreichen will, bestimmte Zeichen, die in den Argumenten vorkommen, aber für die Shell, über die man geht, eine Sonderbedeutung haben. Dann muß man diese eben auch irgendwie escapen, damit diese nicht fälschlicherweise von der Shell als Sonderzeichen erkannt werden.
Ergänzung ()

Ich sehe gerade ( http://stackoverflow.com/questions/1256667/raw-strings-in-java-for-regex-in-particular ), dass es in Java einen besonderen Mechanismus gibt, der es erleichtert, Patterns für regexes zu basteln, weil man sich das lästige Escapen sparen kann:

Code:
Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));

(aus der Antwort des Users ismailsunni)

Danke für die ausführliche Antwort, durch das zwei Schichten Beispiel kann ich es nachvollziehen.
 
Gibt ja auch \n \d \w usw.
Der Interpreter sucht nur nach \ und dann nach dem was dahinter steht.
Ist halt so in den meisten Sprachen geregelt. Skriptsprachen machen es meist logischer, z.B. in Ruby langt ein \d
 
Zurück
Oben