Bunun MULTILINE bayrağıyla ilgisi yoktur; Gördüğünüz şey find()
ve matches()
yöntemleri arasındaki farktır . find()
Bir eşleşme bulunabilir eğer başarılı yerde hedef dizesinde ise matches()
eşleştirmek için regex beklediği tüm dizeyi .
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
Dahası, MULTILINE
ne düşündüğünüz anlamına gelmez. Birçok kişi, hedef dizeniz yeni satırlar içeriyorsa (yani birden çok mantıksal satır içeriyorsa) bu bayrağı kullanmanız gerektiği sonucuna atlamaktadır. Burada SO üzerinde bu yönde birkaç cevap gördüm, ama aslında, bu bayrağın yaptığı tek şey çapaların davranışını değiştirmek ^
ve $
.
Normalde ^
hedef dizenin en başıyla $
eşleşir ve en ucuyla eşleşir (veya sonunda bir yeni satırdan önce, ancak şimdilik bir kenara bırakacağız). Ancak dize yeni satırlar içeriyorsa , MULTILINE bayrağını ayarlayarak herhangi bir mantıksal satırın başlangıcında ve sonunda, tüm dizenin yalnızca başlangıcı ve sonunda değil, eşleştirilmesini ^
ve $
eşleşmesini seçebilirsiniz .
Peki unutmak MULTILINE
demektir ve sadece hatırlamak yapar : davranışını değiştirir ^
ve $
çapa. DOTALL
modu başlangıçta "tek satır" olarak adlandırıldı (ve hala Perl ve .NET dahil olmak üzere bazı tatlarda) ve her zaman benzer karışıklığa neden oldu. Java geliştiricilerinin bu durumda daha açıklayıcı bir adla gittiği için şanslıyız, ancak "çok satırlı" mod için makul bir alternatif yoktu.
Tüm bu çılgınlığın başladığı Perl'de, hatalarını kabul ettiler ve Perl 6 regexes'teki hem "çok satırlı" hem de "tek satırlı" modlardan kurtuldular. Yirmi yıl sonra, belki de dünyanın geri kalanı buna uygun olacak.