Esto no tiene nada que ver con la bandera MULTILINE; Lo que estás viendo es la diferencia entre los métodos find()
y matches()
. find()
tiene éxito si se puede encontrar una coincidencia en cualquier parte de la cadena de destino , mientras se matches()
espera que la expresión regular coincida con la cadena completa .
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
Además, MULTILINE
no significa lo que crees que hace. Muchas personas parecen llegar a la conclusión de que debe usar esa bandera si su cadena de destino contiene nuevas líneas, es decir, si contiene varias líneas lógicas. He visto varias respuestas aquí sobre SO para ese efecto, pero de hecho, todo lo que hace la bandera es cambiar el comportamiento de los anclajes, ^
y $
.
Normalmente ^
coincide con el comienzo de la cadena de destino y $
coincide con el final (o antes de una nueva línea al final, pero lo dejaremos de lado por ahora). Pero si la cadena contiene nuevas líneas, puede elegir ^
y $
coincidir al comienzo y al final de cualquier línea lógica, no solo al inicio y al final de toda la cadena, configurando el indicador MULTILINE.
Así que olvídate de lo que MULTILINE
significa y sólo recuerda lo que hace : cambia el comportamiento de la ^
y $
anclajes. DOTALL
Originalmente, el modo se llamaba "una sola línea" (y todavía tiene algunos sabores, incluidos Perl y .NET), y siempre ha causado una confusión similar. Somos afortunados de que los desarrolladores de Java hayan elegido el nombre más descriptivo en ese caso, pero no había una alternativa razonable para el modo "multilínea".
En Perl, donde comenzó toda esta locura, admitieron su error y se deshicieron de los modos "multilínea" y "línea única" en las expresiones regulares de Perl 6. En otros veinte años, tal vez el resto del mundo habrá seguido su ejemplo.