Cela n'a rien à voir avec l'indicateur MULTILINE; ce que vous voyez est la différence entre les méthodes find()
et matches()
. find()
réussit si une correspondance peut être trouvée n'importe où dans la chaîne cible , tandis que matches()
s'attend à ce que l'expression régulière corresponde à la chaîne entière .
Pattern p = Pattern.compile("xyz");
Matcher m = p.matcher("123xyzabc");
System.out.println(m.find()); // true
System.out.println(m.matches()); // false
Matcher m = p.matcher("xyz");
System.out.println(m.matches()); // true
De plus, MULTILINE
cela ne signifie pas ce que vous pensez que cela fait. Beaucoup de gens semblent sauter à la conclusion que vous devez utiliser cet indicateur si votre chaîne cible contient des retours à la ligne, c'est-à-dire si elle contient plusieurs lignes logiques. J'ai vu plusieurs réponses ici sur SO à cet effet, mais en fait, ce drapeau ne fait que changer le comportement des ancres, ^
et $
.
Correspond normalement ^
au tout début de la chaîne cible et $
correspond à la toute fin (ou avant une nouvelle ligne à la fin, mais nous laisserons cela de côté pour l'instant). Mais si la chaîne contient des retours à la ligne, vous pouvez choisir pour ^
et $
faire correspondre au début et à la fin de toute ligne logique, pas seulement au début et à la fin de la chaîne entière, en définissant l'indicateur MULTILINE.
Alors oubliez ce que MULTILINE
signifie et rappelez-vous simplement ce que cela fait : change le comportement des ancres ^
et $
. DOTALL
Le mode était à l'origine appelé "single-line" (et l'est toujours dans certaines saveurs, y compris Perl et .NET), et il a toujours causé une confusion similaire. Nous avons la chance que les développeurs Java aient choisi le nom le plus descriptif dans ce cas, mais il n'y avait pas d'alternative raisonnable au mode "multiligne".
En Perl, où toute cette folie a commencé, ils ont admis leur erreur et se sont débarrassés des modes "multiligne" et "simple ligne" dans les expressions rationnelles Perl 6. Dans vingt ans, peut-être que le reste du monde aura emboîté le pas.