web-dev-qa-db-fra.com

Quelle est l'utilisation de la méthode Pattern.quote?

J'essaie de comprendre Pattern.quote En utilisant le code suivant:

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545");
System.out.println("Pattern is : "+pattern);

produit la sortie:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E

Que sont \Q Et \E Ici? La description de la documentation dit:

Renvoie un modèle littéral String pour le String spécifié.

Cette méthode produit un String qui peut être utilisé pour créer un Pattern qui correspondrait à la chaîne s comme s'il s'agissait d'un modèle littéral.

Les métacaractères ou les séquences d'échappement de la séquence d'entrée n'auront aucune signification particulière.

Mais le type de retour de Pattern.quote Est String et non un objet compilé Pattern.

Pourquoi cette méthode est-elle requise et quels sont quelques exemples d'utilisation?

52
Prateek

\Q Signifie "début du texte littéral" (c'est-à-dire regex "guillemet ouvert")
\E Signifie "fin du texte littéral" (c'est-à-dire regex "close quote")

L'appel de la méthode Pattern.quote() encapsule la chaîne dans \Q...\E, Ce qui transforme le texte en une expression régulière littérale . Par exemple, Pattern.quote(".*") correspondrait à un point puis à un astérisque:

System.out.println("foo".matches(".*")); // true
System.out.println("foo".matches(Pattern.quote(".*"))); // false
System.out.println(".*".matches(Pattern.quote(".*"))); // true

Le but de la méthode est de ne pas obliger le programmeur à se souvenir des termes spéciaux \Q Et \E Et à ajouter un peu de lisibilité au code - l'expression régulière est déjà assez difficile à lire. Comparer:

someString.matches(Pattern.quote(someLiteral));
someString.matches("\\Q" + someLiteral + "\\E"));

Se référant à javadoc :

Renvoie un motif littéral String pour la chaîne spécifiée.

Cette méthode produit une chaîne qui peut être utilisée pour créer un modèle qui correspondrait à la chaîne s comme s'il s'agissait d'un modèle littéral.

Les métacaractères ou les séquences d'échappement de la séquence d'entrée n'auront aucune signification particulière.

68
Bohemian

Le Pattern.quote la méthode cite une partie d'un modèle d'expression régulière pour que l'expression régulière l'exprime comme des littéraux de chaîne.

Supposons que vous ayez une entrée utilisateur dans votre programme de recherche et que vous souhaitiez la regex. Mais cette entrée peut avoir des caractères dangereux, vous pouvez donc utiliser

Pattern pattern = Pattern.compile(Pattern.quote(userInput));

Cette méthode ne cite pas un Pattern mais, comme vous le faites remarquer, encapsule un String entre guillemets d'expression régulière.

16
Boris the Spider

\Q et \E, entre autres, sont documentés en détail sur la page Java.util.regex.Pattern Javadoc. Ils signifient "commencer Quote ","End quote "et démarrez une région où tous les caractères ont la signification littérale. La façon d'utiliser le retour de Pattern.quote est de le nourrir à Pattern.compile, ou toute autre méthode acceptant une chaîne de modèle, telle que String.split.

9
Marko Topolnik

Si vous compilez la chaîne renvoyée par Pattern.quote, vous obtiendrez un Pattern qui correspond à la chaîne littérale que vous quoted.

\Q et \E marque le début et la fin de la partie entre guillemets de la chaîne.

7
OpenSauce

Regex entre fréquemment en collision avec des cordes normales. Supposons que je souhaite qu'une expression régulière recherche une certaine chaîne qui n'est connue qu'au moment de l'exécution. Comment pouvons-nous être sûrs que la chaîne n'a pas de signification regex, par exemple (".*.*.*")? Nous le citons.

7
spender