350 votes

Comment échapper à texte pour les expressions régulières en Java

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.

480voto

Mike Stone Points 21293

Depuis Java 1.5, oui:

126voto

Pavel Feldman Points 2140

Différence entre Pattern.quote et Matcher.quoteReplacement n’était pas clair pour moi avant d’avoir vu la suite exemple

``

13voto

Rob Oxspring Points 1457

Je pense que ce que vous êtes après est . Voir aussi introduit en Java5.

Voir modèle javadoc pour plus de détails.

10voto

Meower68 Points 168

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.

9voto

Eclipse-user Points 102

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X