इसका MULTILINE ध्वज से कोई लेना-देना नहीं है; आप जो देख रहे हैं, वह find()और matches()विधियों के बीच का अंतर है । find()सफल होता है कि मैच स्ट्रिंग स्ट्रिंग में कहीं भी पाया जा सकता है , जबकि पूरे स्ट्रिंगmatches() से मिलान करने के लिए रेगेक्स की अपेक्षा करता है ।
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
इसके अलावा, MULTILINEइसका मतलब यह नहीं है कि आप क्या सोचते हैं। बहुत से लोग इस निष्कर्ष पर कूदते हैं कि आपको उस झंडे का उपयोग करना है यदि आपके लक्ष्य स्ट्रिंग में नई सुर्खियाँ हैं - अर्थात्, यदि इसमें कई तार्किक रेखाएँ हैं। मैंने एसओ से उस प्रभाव के बारे में कई जवाब यहां देखे हैं, लेकिन वास्तव में, वह सब जो झंडा करता है वह एंकरों के व्यवहार को बदल देता है, ^और $।
आम तौर पर ^लक्ष्य स्ट्रिंग की बहुत शुरुआत से $मेल खाता है , और बहुत अंत से मेल खाता है (या अंत में एक नई रेखा से पहले, लेकिन हम अभी के लिए एक तरफ छोड़ देंगे)। लेकिन अगर स्ट्रिंग नई पंक्तियां शामिल है, आप के लिए चुन सकते हैं ^और $, शुरू में मेल खाते हैं और MULTILINE झंडा निर्धारित करके किसी भी तार्किक लाइन, न सिर्फ शुरुआत है और पूरे स्ट्रिंग के अंत के अंत तक।
तो MULTILINE इसका क्या मतलब है और यह याद रखें कि यह क्या करता है : एंकर ^और $एंकर का व्यवहार बदल जाता है । DOTALLमोड को मूल रूप से "सिंगल-लाइन" कहा जाता था (और अभी भी पर्ल और .NET सहित कुछ स्वादों में है), और इसने हमेशा बहुत भ्रम पैदा किया है। हम भाग्यशाली हैं कि जावा देवता उस मामले में अधिक वर्णनात्मक नाम के साथ गए, लेकिन "मल्टीलाइन" मोड के लिए कोई उचित विकल्प नहीं था।
पर्ल में, जहां यह सब पागलपन शुरू हुआ, उन्होंने अपनी गलती स्वीकार की है और पर्ल 6 रेगेक्स में "मल्टीलाइन" और "सिंगल-लाइन" दोनों तरीकों से छुटकारा पा लिया है। एक और बीस वर्षों में, शायद दुनिया के बाकी हिस्सों ने सूट का पालन किया होगा।