Questo non ha nulla a che fare con la bandiera MULTILINE; ciò 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 matches()
prevede che l'espressione regolare corrisponda a 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, MULTILINE
non significa quello che pensi lo fa. Molte persone sembrano saltare alla conclusione che devi usare quel flag se la tua stringa di destinazione contiene newline - cioè, se contiene più righe logiche. Ho visto diverse risposte qui su SO in tal senso, ma in realtà, tutto ciò che fa questo flag cambia il comportamento degli ancoraggi, ^
e $
.
Normalmente ^
corrisponde all'inizio della stringa di destinazione e $
corrisponde alla fine (o prima di una nuova riga alla fine, ma per ora lasceremo quella parte). Ma se la stringa contiene newline, è possibile scegliere ^
e $
per corrispondere all'inizio e alla fine di qualsiasi linea logica, non solo l'inizio e la fine dell'intera stringa, impostando il flag MULTILINE.
Così dimenticare ciò che MULTILINE
significa e basta ricordare ciò che fa : cambia il comportamento dei ^
e $
ancore. La modalità DOTALL
era originariamente chiamata "single-line" (e si trova ancora in alcune versioni, tra cui Perl e .NET) e ha sempre causato confusione simile. Siamo fortunati che gli sviluppatori Java siano andati con il nome più descrittivo in quel caso, ma non c'era un'alternativa ragionevole per la modalità "multilinea".
In Perl, dove tutta questa follia è iniziata, hanno ammesso il loro errore e si sono sbarazzati delle modalità "multiline" e "single-line" nelle regex di Perl 6. In altri venti anni, forse il resto del mondo avrà seguito l'esempio.
fonte
2010-09-06 14:57:09
Sto provando a trovare un pattern che corrisponda a qualsiasi stringa che inizia con "Commenti degli utenti:". Dopo questo "Commenti utente:" è qualcosa che un utente entra in una textarea, e quindi può contenere * qualsiasi * - anche nuove righe. Sembra che ho bisogno di imparare molto in regex ... – Nivas
Questo funziona (grazie!) Ho provato il modello '(? S) Commenti degli utenti: \ s * (. *)'. Dalla risposta di @Amarghosh ho ottenuto il pattern 'Commenti utente: [\\ s \\ S] *'. Tra questi c'è un modo * migliore * o * consigliato * o sono solo due modi diversi di fare lo stesso? – Nivas
Entrambi significano la stessa cosa; '[\ s \ S]' è un po 'più esplicito ("corrisponde a qualsiasi carattere che sia o spazi bianchi o non spazi bianchi"), '.' è più facile da leggere, ma è necessario cercare' (? s) ' o il modificatore 'DOTALL' per scoprire se le newline sono incluse o meno. Preferirei '.' con il set di simboli' Pattern.DOTALL' (è più facile da leggere e ricordare di '(? S)' a mio parere. Dovresti usare ciò che ritieni più comodo. –