Échapper à une chaîne à partir d'une regex analysée en Java
En Java, supposons que j'ai une variable de type String S, et je tiens à le rechercher à l'intérieur d'une autre Chaîne de T, comme suit:
if (T.matches(S)) ...
(remarque: la ligne ci-dessus a été T. contains() jusqu'à ce que quelques postes de relever que cette méthode n'utilise pas les regexes. Mon mauvais.)
Mais supposons maintenant que S peuvent avoir des personnages peu recommandables. Par exemple, si S = "[hi". Le crochet gauche va provoquer la regex à l'échec. Est-il une fonction que je peux appeler pour échapper à S de sorte que cela ne se produise pas? Dans ce cas particulier, je voudrais qu'il puisse être transformé en "\[hi".
source d'informationauteur doodaddy
Vous devez vous connecter pour publier un commentaire.
Chaîne.contient ne pas utiliser les regex, donc il n'y a pas un problème dans ce cas.
Où une expression régulière est nécessaire, au lieu de rejeter les chaînes avec la regex caractères spéciaux, utilisez java.util.regex.De modèle.citation de leur échapper.
Comme Tom Hawtin dit, vous avez besoin de citer le modèle. Vous pouvez le faire de deux façons (edit: en fait trois façons, comme l'a souligné @diastrophism):
Entourer la chaîne avec "\Q" et "\E", comme:
Utilisation Modèle à la place. Le code pourrait être quelque chose comme ceci:
De cette façon, vous pouvez mettre en cache le masque compilé et le réutiliser. Si vous utilisez le même regex plus d'une fois, vous voudrez certainement faire de cette façon.
Notez que si vous utilisez des expressions régulières pour tester si une chaîne est à l'intérieur d'une chaîne plus longue, vous devriez mettre de l' .* au début et à la fin de l'expression. Mais cela ne fonctionnera pas si vous citez le modèle, car il sera alors à la recherche de réels points. Alors, êtes-vous absolument certain que vous le souhaitez à l'aide d'expressions régulières?
Essayer De modèle.citation(String). Il va corriger tout ce qui a une signification particulière dans la chaîne.
Une raison particulière de ne pas utiliser des chaînes de caractères.indexOf() à la place? De cette façon, il sera toujours interprété comme une chaîne plutôt qu'une regex.
Regex utilise le caractère barre oblique inverse " \ " pour échapper à un littéral. Étant donné que java utilise également le caractère barre oblique inverse vous auriez besoin d'utiliser un double bashslash comme:
Qui deviendra la Chaîne:
qui sera transmis à la regex.
Ou si vous ne se soucient que d'une Chaîne littérale et n'ont pas besoin d'une expression régulière, vous pouvez faire ce qui suit:
T. contains() (selon la javadoc : http://java.sun.com/javase/6/docs/api/java/lang/String.html) ne pas utiliser regexes. contient du (de la) délégués à indexOf ().
Donc, il n'y a PAS regexes utilisé ici. Étiez-vous en pensant à une autre Chaîne de la méthode ?