# RegEx und replaceAll - Probleme mit escapen des Suchbegriffs



## Daniel_L (22. Mrz 2009)

Hallo,

ich möchte mit replaceAll Begriffe ersetzen, die man zuvor in ein JTextField eingeben kann (also ein einfacher "Suchen/Ersetzen" Dialog).

Wenn ich nun Pfadangaben habe, dann könnte ein Suchbegriff so aussehen:

Eingabe JTextField: _..\Listen\a.pdf_
der entsprechende String, per getText(): _..\\Listen\\a.pdf_

Wenn ich nun replaceAll anwende, gibt es eine Syntax-Exception, da der \ ein regEx-char ist, als das der in diesem Fall ja nicht gelten soll:


> SCHWERWIEGEND: zettelkasten.CReplace$ReplaceTask@6c57093c failed: java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 7
> (?i)..\Liste\
> ^
> java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 7
> (?i)..\Liste\



Wenn ich aber alle Punkte und Backslahes escape (ich habe gelesen, Punkte müssen auch escaped werden, weil sie sonst als reg. Ausdruck gelesen werden), habe ich folgenden String: _\.\.\\\\Listen\\\\a.pdf_

Hier gibt es nun eine IndexOutOfBounds-Exception:


> SCHWERWIEGEND: zettelkasten.CReplace$ReplaceTask@41c50999 failed: java.lang.StringIndexOutOfBoundsException: String index out of range: 3
> java.lang.StringIndexOutOfBoundsException: String index out of range: 3
> at java.lang.String.charAt(String.java:687)
> at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
> ...




Frage: Wie escape ich Suchausdrücke richtig, sodass ich sie mit "replaceAll" verwenden kann und bestimmte Zeichen im Suchausdruck nicht als regulärer Ausdruck gezählt werden?


----------



## Ark (22. Mrz 2009)

java.util.regex.Pattern:

\Q  	Nothing, but quotes all characters until \E
\E 	Nothing, but ends quoting started by \Q

Du musst allerdings darauf achten, dass \E vorher speziell behandelt werden muss, weil es da sonst zu Problemen kommt.

Ark


----------



## Wildcard (22. Mrz 2009)

Pattern.quote()


----------



## Daniel_L (22. Mrz 2009)

Vielen Dank für die schnelle Antwort!

Die Index-Exception taucht immer noch auf, aber ich vermute, es könnte diesmal am replacement-String liegen. Dieser ist bspw. "G:\", also als String-Variable "G:\\".

Aber ich dachte, replaceAll verlangt nur als ersten Parameter einen regulären Ausdruck, während der replacement-String beliebig sein kann?

Oder sollte man generell bei replaceAll den replacment-String mit Matcher.quoteReplacement() bearbeiten?

*Nachtrag* So macht auch die Fehlermeldung Sinn, die an 3. Stelle einen IndexOutOfBound liefert: Im replacementString ist an 3. Stelle der Backslash als letztes Zeichen im String...


----------



## Spacerat (24. Mrz 2009)

Daniel_L hat gesagt.:


> habe ich folgenden String: \.\.\\\\Listen\\\\a.pdf


Das mit den Punkten ist absolut Korrekt... Hast du hier nicht einen vergessen ("a\.pdf")?


----------

