J'essaie de comprendre la différence entre matches()
et find()
.
Selon le Javadoc, (d'après ce que je comprends), matches()
cherchera la chaîne entière même s'il trouve ce qu'il cherche, et find()
s'arrêtera quand il trouvera ce qu'il cherche.
Si cette hypothèse est correcte, je ne vois pas quand vous voudriez utiliser à la matches()
place de find()
, à moins que vous ne vouliez compter le nombre de correspondances qu'il trouve.
À mon avis, la classe String devrait alors avoir find()
au lieu d' matches()
une méthode intégrée.
Donc, pour résumer:
- Mon hypothèse est-elle correcte?
- Quand est-il utile d'utiliser à la
matches()
place defind()
?
find()
plusieurs appels peuvent renvoyer des résultats différents pour le mêmeMatcher
. Voir ma réponse ci-dessous.Réponses:
matches
essaie de faire correspondre l'expression à la chaîne entière et d'ajouter implicitement un^
au début et$
à la fin de votre modèle, ce qui signifie qu'il ne recherchera pas de sous-chaîne. D'où la sortie de ce code:123
est une sous-chaîne dea123b
sorte que lafind()
méthode renvoie true.matches()
ne «voit» quea123b
ce qui n'est pas la même chose123
et sort donc faux.la source
matchers()
n'est pas simplement unfind()
avec entourer implicite ^ et $. Sachez qu'appeler.find()
plus d'une fois peut avoir des résultats différents s'il n'est pas précédéreset()
, tandis quematches()
renvoie toujours le même résultat. Voir ma réponse ci-dessous.matches
retourne vrai si la chaîne entière correspond au modèle donné.find
essaie de trouver une sous-chaîne qui correspond au modèle.la source
matches(p)
c'est la même chose quefind("^" + p + "$")
si c'est plus clair."123abc123".matches("[a-z]+")
échouera comme le"123abc123".find("^[a-z]+$")
ferait. Mon point était, celamatches()
vaut pour un match complet, tout commefind()
pour les ancres de début et de fin.Pattern.compile("some pattern").matcher(str).matches()
est égal àPattern.compile("^some pattern$").matcher(str).find()
...("some pattern").matcher(str).matches()
n'est pas exactement égal à...("^some pattern$").matcher(str).find()
ce qui n'est vrai que lors du premier appel. Voir ma réponse ci-dessous.matches()
ne renverra true que si la chaîne complète correspond.find()
va essayer de trouver l' occurrence suivante dans la sous-chaîne qui correspond à l'expression régulière. Notez l'accent mis sur «le prochain». Cela signifie que le résultat defind()
plusieurs appels pourrait ne pas être le même. De plus, en utilisant,find()
vous pouvez appelerstart()
pour renvoyer la position à laquelle la sous-chaîne a été mise en correspondance.Sortira:
Donc, soyez prudent lorsque vous appelez
find()
plusieurs fois si l'Matcher
objet n'a pas été réinitialisé, même lorsque l'expression régulière est entourée de^
et$
pour correspondre à la chaîne complète.la source
find()
considérera la sous-chaîne par rapport à l'expression régulière où asmatches()
considérera l'expression complète.find()
renvoie true uniquement si la sous-chaîne de l'expression correspond au modèle.la source
matches();
ne met pas en mémoire tampon, mais lesfind()
tampons.find()
recherche d'abord la fin de la chaîne, indexe le résultat et renvoie la valeur booléenne et l'index correspondant.C'est pourquoi lorsque vous avez un code comme
À 4: le moteur d'expression régulière utilisant la structure de modèle lira tout votre code (index à index comme spécifié par le
regex[single character]
pour trouver au moins une correspondance. Si une telle correspondance est trouvée, elle sera indexée puis la boucle s'exécutera en fonction de le résultat indexé sinon s'il n'a pas fait de calcul anticipé comme lequelmatches()
; ne le fait pas. L'instruction while ne s'exécuterait jamais car le premier caractère de la chaîne correspondante n'est pas un alphabet.la source