272 votes

Différence entre matches() et find() dans Java Regex

Je suis en train d'essayer de comprendre la différence entre matches() et find().

Selon la Javadoc, (ce que je comprends), matches() recherche l'ensemble de la chaîne, même si elle trouve ce qu'elle cherche, et find() va s'arrêter quand il trouve ce qu'il cherche.

Si cette hypothèse est correcte, je ne vois pas à chaque fois que vous souhaitez utiliser matches() au lieu de find(), sauf si vous voulez compter le nombre de matchs qu'il trouve.

Dans mon opionon la classe String doit alors find() au lieu de matches() comme une fonction intégrée de méthode.

Donc, pour résumer:

  1. Est mon hypothèse est correcte?
  2. Quand est-il utile d'utiliser matches() au lieu de find()?

326voto

Sanjay T. Sharma Points 12620

matches tente de faire correspondre l'expression contre l'ensemble de la chaîne et, implicitement, ajouter un ^ au départ et à l' $ à la fin de votre patron, en ce sens qu'il ne sera pas une sous-chaîne. D'où la sortie de ce code:

public static void main(String[] args) throws ParseException {
    Pattern p = Pattern.compile("\\d\\d\\d");
    Matcher m = p.matcher("a123b");
    System.out.println(m.find());
    System.out.println(m.matches());

    p = Pattern.compile("^\\d\\d\\d$");
    m = p.matcher("123");
    System.out.println(m.find());
    System.out.println(m.matches());
}

/* output:
true
false
true
true
*/

123 est une sous-chaîne d' a123b si l' find() méthode de sorties de vrai. matches() seulement 'voit' a123b ce qui n'est pas le même que 123 et donc renvoie false.

85voto

khachik Points 12589

retourne true si la chaîne entière correspond au modèle donné.essaie de trouver une sous-chaîne qui correspond au modèle.

67voto

Leo Holanda Points 755

matches() ne retourne true si la chaîne est mis en correspondance. find() va essayer de trouver la prochaine apparition au sein de la sous-chaîne correspondant à l'expression régulière. Note de l'accent mis sur "suivant". Cela signifie que le résultat de l'appel d' find() plusieurs fois pourrait ne pas être la même. En outre, en utilisant find() vous pouvez appeler start() pour renvoyer la position de la sous-chaîne a été trouvée.

final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());

System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());

Sortie:

Trouvé: faux
Trouvé: vrai - position 4
Trouvé: vrai - position 17
Trouvé: vrai - position 20
Trouvé: faux
Trouvé: faux
Correspondance: faux
-----------
Trouvé: vrai - position 0
Trouvé: faux
Trouvé: faux
Correspondance: vrai
Correspondance: vrai
Correspondance: vrai
Correspondance: vrai

Alors, soyez prudent lors de l'appel d' find() plusieurs fois si l' Matcher objet n'a pas été réinitialisé, même si la regex est entouré d' ^ et $ pour correspondre à la chaîne complète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X