Ini tidak ada hubungannya dengan bendera MULTILINE; apa yang Anda lihat adalah perbedaan antarafind()
matches()
metode dan metode. find()
berhasil jika kecocokan dapat ditemukan di mana saja di string target , sementara matches()
mengharapkan regex untuk mencocokkan seluruh string .
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
Selain itu, MULTILINE
tidak berarti apa yang Anda pikirkan. Banyak orang tampaknya melompat ke kesimpulan bahwa Anda harus menggunakan bendera itu jika string target Anda berisi baris baru - yaitu, jika itu berisi beberapa baris logis. Saya telah melihat beberapa jawaban di sini pada SO untuk efek itu, tetapi pada kenyataannya, semua yang dilakukan flag adalah mengubah perilaku jangkar, ^
dan $
.
Biasanya ^
cocok dengan yang paling awal dari string target, dan $
cocok dengan yang paling akhir (atau sebelum baris baru di akhir, tapi kami akan mengesampingkannya untuk saat ini). Tetapi jika string berisi baris baru, Anda dapat memilih ^
dan $
mencocokkan pada awal dan akhir dari setiap baris logis, bukan hanya awal dan akhir dari seluruh string, dengan mengatur bendera MULTILINE.
Jadi lupakan apa MULTILINE
berarti dan hanya ingat apa yang dilakukannya : mengubah perilaku ^
dan $
jangkar. DOTALL
mode awalnya disebut "single-line" (dan masih dalam beberapa rasa, termasuk Perl dan .NET), dan selalu menyebabkan kebingungan yang sama. Kami beruntung bahwa para pengembang Java menggunakan nama yang lebih deskriptif dalam kasus itu, tetapi tidak ada alternatif yang masuk akal untuk mode "multiline".
Di Perl, di mana semua kegilaan ini dimulai, mereka mengakui kesalahan mereka dan menyingkirkan mode "multiline" dan "single-line" di Perl 6 regex. Dalam dua puluh tahun lagi, mungkin seluruh dunia akan mengikutinya.