Java a-t-il un moyen intégré d’échapper texte arbitraire afin qu’il soit inclus dans une expression régulière ? Par exemple, si mes utilisateurs saisissez « 5$ », je voudrais correspondre ce exactement au lieu d’un « 5 » après la fin de l’entrée.
Réponses
Trop de publicités?Depuis Java 1.5, oui:
Je pense que ce que vous êtes après est . Voir aussi
introduit en Java5.
Voir modèle javadoc pour plus de détails.
Tout d'abord, si
- vous utilisez replaceAll()
- vous N'utilisez PAS de Correspondance.quoteReplacement()
- le texte à remplacer dans comprend un $1
il ne mettra pas un 1 à la fin. Il va chercher à la recherche de regex pour la première correspondance de groupe et de sous le. C'est ce que $1, $2 ou $3 signifie dans le texte de remplacement: correspondance des groupes à partir du modèle de recherche.
J'ai souvent plug longues chaînes de texte .les propriétés des fichiers, puis de générer les sujets de courriel et les corps de ceux-ci. En effet, cela semble être la valeur par défaut de façon à ne i18n dans le Framework Spring. J'ai mis des balises XML, comme des espaces réservés, dans les cordes et j'utilise replaceAll() pour remplacer les balises XML avec les valeurs lors de l'exécution.
J'ai couru dans un problème où une entrée de l'utilisateur un dollars et en cents figure, avec un signe dollar. replaceAll() est étouffé avec elle, avec les montrant dans une stracktrace:
java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)
Dans ce cas, l'utilisateur a saisi "$3" quelque part de leurs commentaires et de replaceAll() est allé à la recherche dans la recherche regex pour le troisième groupe correspondant, n'est-ce pas en trouver un, et de vomi.
Donnée:
// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input
remplacement
msg = msg.replaceAll("<userInput \\/>", userInput);
avec
msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));
résolu le problème. L'utilisateur peut mettre dans n'importe quel type de caractères, y compris les signes dollar, sans problème. Il se comportait exactement de la façon que vous attendez.
Pour avoir protégé le modèle, vous pouvez remplacer tous les symboles par « \\ », sauf les chiffres et les lettres. Et après cela, vous pouvez mettre dans ce modèle protégé vos symboles spéciaux pour rendre ce modèle ne fonctionne pas comme stupide texte cité, mais vraiment comme un patten, mais votre propre. Sans symboles spéciaux de l’utilisateur.