মাল্টলাইন পতাকার সাথে এর কোনও যোগসূত্র নেই; আপনি যা দেখছেন তা হ'ল পদ্ধতি 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
মানে এবং মাত্র স্মরণ এটা কি করে : এর আচরণগুলিকে পরিবর্তন করে ^
এবং $
নোঙ্গর। DOTALL
মোডটি প্রথমে "একক-লাইন" নামে পরিচিত ছিল (এবং এখনও পার্ল এবং .NET সহ কিছু স্বাদে রয়েছে) এবং এটি সর্বদা একই ধরণের বিভ্রান্তির সৃষ্টি করে। আমরা ভাগ্যবান যে জাভা দেবগণ সেই ক্ষেত্রে আরও বর্ণনামূলক নামের সাথে চলেছিলেন, তবে "মাল্টলাইন" মোডের কোনও যুক্তিসঙ্গত বিকল্প ছিল না।
পার্লে, যেখানে এই সমস্ত উন্মাদনা শুরু হয়েছিল, তারা তাদের ভুল স্বীকার করেছে এবং পার্ল 6 রেজিজেসে "মাল্টলাইন" এবং "একক লাইন" উভয় পদ্ধতি থেকে মুক্তি পেয়েছে। আরও বিশ বছরে, সম্ভবত বিশ্বের বাকী অংশগুলি অনুসরণ করবে।