De public boolean hasNext(String pattern)
documentation:
Renvoie true si le jeton suivant correspond au modèle construit à partir de la chaîne spécifiée.
Ici prochain jeton est []
pas seulement [
(puisque delimiter est un ou plusieurs espaces) mais " *\\["
modèle ne correspond pas à ce jeton entièrement (]
ne correspond pas) si vous êtes informé par résultat false
.
Si vous voulez vérifier si le jeton commence par [
vous pouvez ajouter .*
à la fin de votre modèle pour le laisser correspondre au reste du jeton. Vous pouvez également supprimer *
puisque les espaces sont délimiteurs par défaut, donc ils ne peuvent pas faire partie du jeton.
En cas de
Pattern p = Pattern.compile(" *\\[");
System.out.println(p.asPredicate().test("a[]")); //true
Si vous jetez un oeil à code de asPredicate
vous le verrez est mis en œuvre comme:
public Predicate<String> asPredicate() {
return s -> matcher(s).find();
}
méthode find()
ne vérifie pas si la chaîne entière correspond au motif, mais essaie de trouver une partie de celui-ci qui correspond au motif. Puisque []
contient zéro ou plusieurs espaces suivis de [
, vous voyez true
comme résultat.
Essayez avec 's.hasNext (p)' – horcrux
@horcrux De javadoc: * Une invocation de cette méthode de la forme hasNext (modèle * se comporte exactement de la même manière que l'invocation * hasNext (Pattern.compile (motif)). * – SpaceTrucker
@SpaceTrucker Vous avez raison. Donc le point est que 'Pattern.compile (myRegex) p.asPredicate(). Test (myString)' recherche une occurrence de 'myRegex' dans' myString', tandis que 'new Scanner (myString) .hasNext (myRegex)' vérifie si tout le contenu de 'myString' correspond à' myRegex'. – horcrux