La chaîne Java ReplaceAll et ReplaceFirst échouent à $ Symbol au remplacement du texte
J'ai écrit ce code:
public static void main(String args[]) throws Exception {
String template = "The user has spent amount in a day";
String pattern = "amount";
String output = template.replaceAll(pattern, "$ 100");
System.out.println(output);
}
C'est ce qui arrive quand je le lance:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:713)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at java.lang.String.replaceAll(String.java:2190)
at demo.BugDemo.main(BugDemo.java:16)
Java Result: 1
Je suis en train de lire des données à partir d'un fichier. Dois-je échapper à toutes $
symboles dans le fichier de données, ou est-ce inutile? Est-il une autre classe ou à la bibliothèque pour gérer cette situation?
Quel est le problème avec le fait d'avoir un symbole spécial dans le texte de remplacement (pas dans la regex)?
Notes:
- Je ne veux pas de vérifier chaque caractère à s'échapper. C'est pourquoi je suis en posant cette question.
- Je suis à l'aide de Java 6.
source d'informationauteur kamaci | 2013-01-04
Vous devez vous connecter pour publier un commentaire.
String.replaceAll
prend une expression régulière correspondant modèle comme premier paramètre, et une expression régulière remplacement modèle comme second paramètre - et$
a un sens précis dans les expressions régulières (à la fois la reconnaissance de motifs et de remplacement des rythmes, mais en des sens différents).Suffit d'utiliser
String.remplacez
au lieu de cela, et je soupçonne tous vos problèmes disparaîtront. Vous devez uniquement utiliserreplaceAll
lorsque vous avez réellement voulez de match/remplacer par une expression régulière - que je ne pense pas que vous faites dans ce cas.EDIT: pour ce qui est de votre question:
Encore une fois, la documentation de
replaceAll
est clair à ce sujet:Donc, si vous voulez traiter la correspondant motif comme une expression régulière, mais pas le remplacement, puis utilisez
Matcher.quoteReplacement
.Dans une chaîne de caractères de remplacement,
$
est un caractère spécial: il est utilisé pour saisir appariés groupes à partir de la configuration que vous souhaitez remplacer. Vous pouvez en lire plus à ce sujet ici.Pour résoudre ce problème, vous pouvez citer la chaîne de remplacement pour supprimer tous les sens spécial de
$
caractères:Essayer celui-ci
$
est utilisé un symbole pour spécifier le remplacement du groupe. Vous devez vous échapper:Caractère spécial $ peuvent être gérés de façon simple.
Découvrez ci-dessous l'exemple
De sortie: