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.