Java PatternSyntaxException: Illégal de la répétition sur la chaîne de substitution?

Je suis en train d'écrire une méthode qui vous permettra d'accepter un String, l'inspecter pour les instances de certains tokens (par exemple ${fizz}, ${buzz}, ${foo}, etc.) et de remplacer chaque jeton avec une nouvelle chaîne qui est récupérée à partir d'un Map<String,String>.

Par exemple, si je passe cette méthode de la chaîne de caractères suivante:

"Comment maintenant ${fizz} vache. Le ${buzz} avait curieusement en forme ${foo}."

Et si la méthode consulté le suivant Map<String,String>:

Key             Value
==========================
"fizz"          "brown"
"buzz"          "arsonist"
"foo"           "feet"

Ensuite, la chaîne résultante serait:

"Comment maintenant noireaude. Le pyromane a curieusement en forme de pieds."

Voici ma méthode:

String substituteAllTokens(Map<String,String> tokensMap, String toInspect) {
    String regex = "\$\\{([^}]*)\\}";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(toInspect);
    while(matcher.find()) {
        String token = matcher.group();     //Ex: ${fizz}
        String tokenKey = matcher.group(1); //Ex: fizz
        String replacementValue = null;

        if(tokensMap.containsKey(tokenKey))
            replacementValue = tokensMap.get(tokenKey);
        else
            throw new RuntimeException("String contained an unsupported token.");

        toInspect = toInspect.replaceFirst(token, replacementValue);
    }

    return toInspect;
}

Lorsque je l'exécute, j'obtiens l'exception suivante:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 0
${fizz}
^
    at java.util.regex.Pattern.error(Pattern.java:1730)
    at java.util.regex.Pattern.closure(Pattern.java:2792)
    at java.util.regex.Pattern.sequence(Pattern.java:1906)
    at java.util.regex.Pattern.expr(Pattern.java:1769)
    at java.util.regex.Pattern.compile(Pattern.java:1477)
    at java.util.regex.Pattern.<init>(Pattern.java:1150)
    at java.util.regex.Pattern.compile(Pattern.java:840)
    at java.lang.String.replaceFirst(String.java:2158)
    ...rest of stack trace omitted for brevity (but available upon request!)

Pourquoi suis-je cela? Et est-ce la bonne solution? Merci à l'avance!

OriginalL'auteur | 2013-07-04