Pourquoi ne replaceAll échouer avec “illégal groupe de référence”?
Je suis dans le besoin de remplacer
\\\s+\$\$ to $$
J'ai utilisé
String s = " $$";
s = s.replaceAll("\\s+\$\$","$$");
mais il jette exception
java.lang.IllegalArgumentException: groupe Illégal de référence
- J'ai de l'expérience exactement le même problème avec
replaceFirst()
. Les réponses ci-dessous vous aidera aussi.
Vous devez vous connecter pour publier un commentaire.
Utilisation
"\\$\\$"
dans le deuxième paramètre:La
$
est le symbole de groupe dans la regex de remplacement paramètreSi vous avez besoin d'échapper
De String#replaceAll javadoc:
Afin de s'échapper de l'arbitraire d'un chaîne de remplacement peut être fait en utilisant Matcher#quoteReplacement:
Aussi s'échapper du motif peut être fait avec Modèle#citation
String.replaceAll(regexp, replacement)
ne pas le document qu'elle traite la Chaîne de remplacement, comme une regexp derrière les coulisses. En tant que programmeur, j'ai peut-être intéressé à utiliser une regexp pour la correspondance, mais un littéral pour le remplacement -- et si il n'y a aucune indication dans la doc API, je m'attends juste à ce que cela arrive.String
, mais pas sur la première ligne. Désolé pour ma faille.Le problème ici n'est pas à l'expression régulière, mais le remplacement:
$ est utilisé pour se référer à
()
des groupes correspondants. Si vous avez besoin d'échapper aussi bien avec une barre oblique inverse (et une deuxième barre oblique inverse pour faire le compilateur java heureux):C'est la bonne façon. Remplacer le literar $ par échappé \\$
str.replaceAll("\\$", "\\\\\\$")
$
a une signification spéciale dans la chaîne de remplacement, ainsi que dans l'expression rationnelle, de sorte que vous avez à s'échapper il y, trop:J'ai eu le même problème, donc je finis la mise en œuvre de remplacer tous avec split.
Il a résolu l'exception pour moi