Questo non ha nulla a che fare con la bandiera MULTILINE; quello che vedi è la differenza tra i metodi find()e matches(). find()ha esito positivo se è possibile trovare una corrispondenza in qualsiasi punto della stringa di destinazione , mentre si matches()aspetta che la regex corrisponda all'intera stringa .
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
Inoltre, MULTILINEnon significa quello che pensi che faccia. Molte persone sembrano saltare alla conclusione che è necessario utilizzare quel flag se la stringa di destinazione contiene nuove righe, ovvero se contiene più righe logiche. Ho visto diverse risposte qui su SO in tal senso, ma in realtà, tutto ciò che fa bandiera è cambiare il comportamento delle ancore, ^e $.
Normalmente ^corrisponde all'inizio della stringa di destinazione e $corrisponde alla fine (o prima di una nuova riga alla fine, ma per ora lo lasceremo da parte). Ma se la stringa contiene nuove righe, puoi scegliere ^e $far corrispondere all'inizio e alla fine di qualsiasi riga logica, non solo all'inizio e alla fine dell'intera stringa, impostando il flag MULTILINE.
Quindi dimentica cosa MULTILINE significa e ricorda cosa fa : cambia il comportamento di ^e delle $ancore. DOTALLla modalità era originariamente chiamata "single-line" (ed è ancora in alcuni gusti, tra cui Perl e .NET), e ha sempre causato confusione simile. Siamo fortunati che gli sviluppatori Java abbiano scelto il nome più descrittivo in quel caso, ma non c'erano alternative ragionevoli per la modalità "multilinea".
In Perl, dove è iniziata tutta questa follia, hanno ammesso il loro errore e si sono sbarazzati delle modalità "multilinea" e "a linea singola" nelle regex di Perl 6. Tra altri venti anni, forse il resto del mondo avrà seguito l'esempio.