web-dev-qa-db-fra.com

Pourquoi replaceAll échoue-t-il avec "référence de groupe illégale"?

J'ai besoin de remplacer 

\\\s+\\$\\$ to $$

J'ai utilisé 

String s = "  $$";
s = s.replaceAll("\\s+\\$\\$","$$");

mais il jette exception

Java.lang.IllegalArgumentException: référence de groupe illégale

47
Sathish Kumar k k

Utilisez "\\$\\$" dans le deuxième paramètre:

String s="  $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");

Le $ est un symbole de groupe dans le paramètre de remplacement de regex

Donc, vous devez y échapper

41
Koerr

De String # replaceAll javadoc :

Notez que les barres obliques inverses (\) et les signes dollar ($) dans le remplacement chaîne peut entraîner des résultats différents de ceux obtenus s'il s'agissait de traité comme une chaîne de remplacement littéral; voir Matcher.replaceAll. Utilisation Matcher.quoteReplacement (Java.lang.String) pour supprimer le spécial signification de ces caractères, si vous le souhaitez.

Il est donc possible d'échapper à une chaîne de remplacement arbitraire en utilisant Matcher # quoteReplacement :

String s = "  $$";
s = s.replaceAll("\\s+\\$\\$", Matcher.quoteReplacement("$$"));

Vous pouvez également échapper au motif avec Pattern # quote

String s = "  $$";
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$"));
75
Andrey

Le problème ici n'est pas l'expression régulière, mais le remplacement:

$ est utilisé pour faire référence aux groupes correspondants (). Vous devez donc également y échapper avec une barre oblique inverse (et une seconde barre oblique inverse pour rendre le compilateur Java heureux):

String s="  $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
5
Hendrik Brummermann

C'est le bon chemin. Remplacez le littéraire $ par échappé \\ $ str.replaceAll("\\$", "\\\\\\$")

1
Augusto Souza

$ a une signification particulière dans la chaîne de remplacement ainsi que dans la regex.

s=s.replaceAll("\\s+\\$\\$", "\\$\\$");
0
Alan Moore
String s="$$";
        s=s.replaceAll("\\s+\\$\\$","$$");
0
Mohammod Hossain

J'ai eu le même problème, alors je finis par implémenter tout remplacer par split.
Il a résolu l'exception pour moi

public static String replaceAll(String source, String key, String value){
    String[] split = source.split(Pattern.quote(key));
    StringBuilder builder = new StringBuilder();
    builder.append(split[0]);
    for (int i = 1; i < split.length; i++) {
        builder.append(value);
        builder.append(split[i]);
    }
    while (source.endsWith(key)) {
        builder.append(value);
        source = source.substring(0, source.length() - key.length());
    }
    return builder.toString();
}
0
Ilya Gazman