Pourquoi replaceAll échoue avec une «référence de groupe illégale»?

J’ai besoin de remplacer

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

j’ai utilisé

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

mais il jette une exception

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

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

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

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

Donc, vous devez y échapper

De Ssortingng # replaceTous les javadoc :

Notez que les barres obliques inverses (\) et les signes dollar ($) dans la chaîne de remplacement peuvent entraîner une différence entre les résultats et le traitement en tant que chaîne de remplacement littérale. voir Matcher.replaceAll. Utilisez Matcher.quoteReplacement (java.lang.Ssortingng) pour supprimer la signification particulière de ces caractères, si vous le souhaitez.

Il est donc possible d’échapper à une chaîne de remplacement arbitraire à l’aide de Matcher # quoteReplacement :

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

Échapper aussi au motif peut être fait avec le motif # quote

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

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

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

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

C’est le bon chemin. Remplacez le littéral $ par escaped \\ $ str.replaceAll("\\$", "\\\\\\$")

$ a une signification particulière dans la chaîne de remplacement ainsi que dans l’expression régulière, vous devez donc y échapper aussi:

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

J’ai eu le même problème, donc je finis par mettre en œuvre tous les remplacer par un split.
Il a résolu l’exception pour moi

 public static Ssortingng replaceAll(Ssortingng source, Ssortingng key, Ssortingng value){ Ssortingng[] split = source.split(Pattern.quote(key)); SsortingngBuilder builder = new SsortingngBuilder(); 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(); }