# String.replaceAll - warum PatternSyntaxException?



## t3_chris (1. Sep 2008)

Hallo!

Ich versuche gerade mit String.replaceAll() den String


```
<subreportExpression  class="java.lang.String"><![CDATA[\$P{SUBREPORT_DIR} + "Subreport-Test.jasper"]]></subreportExpression>
```

durch folgenden String zu erstetzen:


```
<subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[\$P{INTERNAL-SUBREPORT-Subreport-Test}]]></subreportExpression>
```

Leider löste aber bereits das Suchen nach dem Quell-String folgende Exception aus:


```
SEVERE [global]
java.util.regex.PatternSyntaxException: Illegal character range near index 88
<subreportExpression  class="java.lang.String"><![CDATA[\$P{SUBREPORT_DIR} + "Subreport-Gulasch.jasper"]]></subreportExpression>
                                                                                        ^
        at java.util.regex.Pattern.error(Pattern.java:1713)
        at java.util.regex.Pattern.range(Pattern.java:2355)
        at java.util.regex.Pattern.clazz(Pattern.java:2268)
        at java.util.regex.Pattern.clazz(Pattern.java:2210)
        at java.util.regex.Pattern.sequence(Pattern.java:1818)
        ....
```

Warum ist das so? Ich habe ja beide Strings mit String regexForSubreport = Matcher.quoteReplacement(subreportExpression); versucht zu quoten, damit sie als Literal erkannt werden.

Warum quotet eigentlich Matcher.quoteReplacement den Punkt(.) for .jasper nicht? Gibt es eine andere Funktion um einen String als Literal zur Regular Expression zu quoten?

Stehe im Moment etwas auf der Leitung....

Danke schon mal im Voraus!

mfg
   christian


----------



## Verjigorm (1. Sep 2008)

Ich denke mal, du musst alle " maskieren -> \"


----------



## SlaterB (1. Sep 2008)

hey Verjigorm, Frage lesen würde helfen 

-------

ich kann nicht sagen, warum der Punkt nicht escaped wird, aber kann man sich ja selber zurechtschreiben, hier die Vorlage

```
/**
     * Returns a literal replacement <code>String</code> for the specified
     * <code>String</code>.
     *
     * This method produces a <code>String</code> that will work
     * use as a literal replacement <code>s</code> in the
     * <code>appendReplacement</code> method of the {@link Matcher} class.
     * The <code>String</code> produced will match the sequence of characters
     * in <code>s</code> treated as a literal sequence. Slashes ('\') and
     * dollar signs ('$') will be given no special meaning.
     *
     * @param  s The string to be literalized
     * @return  A literal string replacement
     * @since 1.5
     */
    public static String quoteReplacement(String s) {
        if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
            return s;
        StringBuffer sb = new StringBuffer();
        for (int i=0; i<s.length(); i++) {
            char c = s.charAt(i);
            if (c == '\\') {
                sb.append('\\'); sb.append('\\');
            } else if (c == '$') {
                sb.append('\\'); sb.append('$');
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }
```


----------



## t3_chris (1. Sep 2008)

Verjigorm hat gesagt.:
			
		

> Ich denke mal, du musst alle " maskieren -> \"



Danke für die schnelle Antwort. Ich bin aber auf der Suche nach einer Funktion welche für mich quotet. Damit will ich Fehler durch mein Quoting ausschließen (könnte ja ein bestimmtes Meta-Zeichen der Regex übersehen,...).


----------



## t3_chris (1. Sep 2008)

Danke an alle die sich Gedanken gemacht haben. Habe die Lösung gefunden:


```
String quoted = Pattern.quote(unquotedString);
```


----------

