Bonjour à tous,
Je viens de passer de longues minutes à m'arracher les quelques cheveux qu'il me restaient à cause d'un contenu de chaine de remplacement ...
Voici le cas "critique" qui peut faire que vos collègues fassent appel aux gentils messieurs en blouses blanches.
Le but : remplacer toutes les occurences de "{modele}" par une chaine saisie par l'utilisateur.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public String test(String valeur) { String source = "Voici un texte avec {modele} à l'intérieur..."; String resultat = source.replaceAll("\\{modele\\}", valeur); return resultat; }
Dans presque tous les cas de contenu de "valeur" tout se passe bien
Il y a par contre au moins 2 cas qui posent problème en provoquant une StringIndexOutOfBoundsException.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test("azerty") -> "Voici un texte avec azerty à l'intérieur..." test("a.z?e!r^t[y") -> "Voici un texte avec a.z?e!r^t[y à l'intérieur..."
par contre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test("$") -> An exception occurred: java.lang.StringIndexOutOfBoundsException test("\\") -> An exception occurred: java.lang.StringIndexOutOfBoundsException
Notez bien que dans le cas du $ il y a 6 \.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test("$".replaceAll("\\$","\\\\\\$") -> "Voici un texte avec $ à l'intérieur..." test("\\".replaceAll("\\\\","\\\\\\\\") -> "Voici un texte avec \ à l'intérieur..."
Donc si je place cet encodage dans ma fonction on obtient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public String test(String valeur) { String source = "Voici un texte avec {modele} à l'intérieur..."; String valeur_encodee = valeur.replaceAll("\\\\","\\\\\\\\").replaceAll("\\$","\\\\\\$"); String resultat = source.replaceAll("\\{modele\\}", valeur_encodee); return resultat; }
Suite à la réponse #5 de Arcadia, voici le code équivalent avec "java.util.Matcher.quoteReplacement()" :
devyan.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public String test(String valeur) { String source = "Voici un texte avec {modele} à l'intérieur..."; String valeur_encodee = Matcher.quoteReplacement(valeur); String resultat = source.replaceAll("\\{modele\\}", valeur_encodee); return resultat; }
Partager