pattern.matcher () vs pattern.matches ()

Je me demande pourquoi les résultats de java regex pattern.matcher () et pattern.matches () diffèrent lorsque la même expression régulière et la même chaîne sont fournies

Ssortingng str = "hello+"; Pattern pattern = Pattern.comstack("\\+"); Matcher matcher = pattern.matcher(str); while (matcher.find()) { System.out.println("I found the text " + matcher.group() + " starting at " + "index " + matcher.start() + " and ending at index " + matcher.end()); } System.out.println(java.util.regex.Pattern.matches("\\+", str)); 

Les résultats de ce qui précède sont:

 I found the text + starting at index 5 and ending at index 6 false 

J’ai trouvé que l’utilisation d’une expression pour faire correspondre la chaîne complète fonctionne correctement en cas de matches(".*\\+") .

pattern.matcher(Ssortingng s) renvoie un Matcher capable de trouver des patterns dans les Ssortingng s . pattern.matches(Ssortingng str) teste si la chaîne entière ( str ) correspond au modèle.

En bref (juste pour rappeler la différence):

  • pattern.matcher – teste si la chaîne contient un motif
  • pattern.matches – teste si la chaîne est un motif

Matcher.find() tente de trouver la prochaine sous-séquence de la séquence d’entrée correspondant au modèle.

Pattern.matches(Ssortingng regex, CharSequence input) comstack l’expression rationnelle dans un Matcher.matches() et renvoie Matcher.matches() .

Matcher.matches tente de faire correspondre la région entière (chaîne) au motif (Regex).

Donc, dans votre cas, Pattern.matches("\\+", str) retourne une valeur false car str.equals("+") est false.

Dans le Javadoc, voir la section if et uniquement si la région entière

  /** * Attempts to match the entire region against the pattern. * * 

If the match succeeds then more information can be obtained via the * start, end, and group methods.

* * @return true if, and only if, the entire region sequence * matches this matcher's pattern */ public boolean matches() { return match(from, ENDANCHOR); }

Donc, si votre chaîne était juste “+”, vous obtiendrez un résultat réel.

matches correspond à l’expression sur la chaîne entière. Le sens, il vérifie si la chaîne entière est un patern ou pas. pense conceptuellement comme cela, il ajoute implicitement un ^ au début et $ à la fin de votre modèle.

Pour Ssortingng, str = “hello +”, si vous voulez que matches () renvoie true, vous devez utiliser un modèle du type “. \ +.

J’espère que cela répond à votre question.

Pattern.matches teste la chaîne entière, dans votre cas, vous devez utiliser:

  System.out.println(java.util.regex.Pattern.matches(".*\\+", str)); 

Ce qui signifie n’importe quelle chaîne et un symbole +

Je pense que votre question devrait vraiment être “Quand devrais-je utiliser la méthode Pattern.matches() ?”, Et la réponse est “Jamais”. Vous attendiez-vous à ce qu’il retourne un tableau des sous-chaînes correspondantes, comme le font les méthodes de Matches de .NET? C’est une attente tout à fait raisonnable, mais non, Java n’a rien de tel.

Si vous voulez juste faire une correspondance rapide, décorez l’expression avec .* À chaque extrémité et utilisez la méthode matches() la chaîne:

 System.out.println(str.matches(".*\\+.*")); 

Si vous souhaitez extraire plusieurs correspondances ou accéder aux informations relatives à une correspondance par la suite, créez une instance de Matcher et utilisez ses méthodes, comme vous l’avez fait dans votre question. Pattern.matches() n’est qu’une opportunité gâchée.

 Matcher matcher = pattern.matcher(text); 

Dans ce cas, une instance d’object matcher sera renvoyée. Elle effectuera des opérations de correspondance sur le texte d’entrée en interprétant le modèle. Ensuite, nous pouvons utiliser, matcher.find() pour correspondre à non. des motifs du texte saisi.

 (java.util.regex.Pattern.matches("\\+", str)) 

Ici, l’object appariement sera créé implicitement et un booléen sera renvoyé, ce qui fera correspondre tout le texte au motif. Cela fonctionnera comme la fonction str.matches(regex) dans Ssortingng.

Le code équivalent à java.util.regex.Pattern.matches("\\+", str) serait:

 Pattern.comstack("\\+").matcher(str).matches(); 

La méthode find trouvera la première occurrence du pattern dans la chaîne.