Une chaîne de remplacement lève une erreur avec le signe $

J’ai un problème avec le remplacement d’une chaîne en Java …

la ligne est:

subject = subject.replaceAll("\\[calEvent\\]", calSubject); 

Cette ligne ne fonctionne pas avec $ sign dans calSubject.

la variable sujet est une variable de ligne d’object dynamic à partir d’un fichier. par exemple, comme ceci: Calnot = [calEvent]

ce que j’essaie de faire est de remplacer le titulaire de la place calEvent par la variable sujet. mais comment j’ai fait cela ne fonctionne pas car il se bloque lorsque le sujet contient un signe $.

aucune idée de comment je peux faire cela pour que ça ne casse pas si le sujet contient un signe $ ou des personnages?

En effet, le signe dollar étant un caractère spécial dans une chaîne de remplacement, utilisez Matcher.quoteReplacement() pour échapper à ce type de caractère.

 subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject)); 

De la doc de Ssortingng.replaceAll() :

Notez que les barres obliques inverses ( \ ) et les signes dollar ( $ ) dans la chaîne de remplacement peuvent entraîner des résultats différents de ceux obtenus si elle était traitée comme une 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.

Notez que le signe dollar est utilisé pour faire référence aux groupes de capture correspondants dans l’expression régulière ( $0 , $1 , etc.).

MODIFIER

Matcher.quoteReplacement() a été introduit dans Java 1.5. Si vous êtes bloqué dans Java 1.4, vous devez échapper manuellement $ en le remplaçant par \$ dans la chaîne. Mais puisque Ssortingng.replaceAll() prendrait également les caractères \ et $ comme caractères spéciaux, vous devez les échapper une fois et vous devez également échapper à nouveau tous les \ pour l’exécution Java.

 ("$", "\$") /* what we want */ ("\$", "\\\$") /* RegExp engine escape */ ("\\$", "\\\\\\$") /* Java runtime escape */ 

Nous obtenons donc:

 calSubject = calSubject.replaceAll("\\$", "\\\\\\$"); 

si vous n’avez pas besoin de la fonctionnalité regex , vous pouvez envisager d’utiliser cette méthode de la classe Ssortingng: replace (cible CharSequence, remplacement de CharSequence)

Il enregistre également vos barres obliques inverses “d’évasion”.

api doc:

Remplace chaque sous-chaîne de cette chaîne qui correspond à la séquence cible littérale par la séquence de remplacement littéral spécifiée . Le remplacement se poursuit du début à la fin de la chaîne, par exemple, remplacer “aa” par “b” dans la chaîne “aaa” donnera “ba” plutôt que “ab”.

De la documentation de replaceAll:

Notez que les barres obliques inverses () et les signes dollar ($) dans la chaîne de remplacement peuvent entraîner des résultats différents de ceux obtenus si elle était traitée comme une chaîne de remplacement littéral; voir Matcher.replaceAll. Utilisez java.util.regex.Matcher.quoteReplacement pour supprimer la signification particulière de ces caractères, si vous le souhaitez.

Et dans Matcher.replaceAll

Les signes dollar peuvent être traités comme des références aux sous-séquences capturées, comme décrit ci-dessus, et des barres obliques inverses sont utilisées pour échapper des caractères littéraux dans la chaîne de remplacement.

Pas sûr que je comprends vraiment votre question mais essayez

 subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject)); 

Veuillez utiliser

 Matcher.quoteReplacement(calEvent);