!rm`.*$
একটি একক রেজেক্সের সাথে, রেটিনা ম্যাচ মোডে চলে। এটি সাধারণত ম্যাচের সংখ্যা প্রিন্ট করে তবে !আমরা এটির পরিবর্তে আসল ম্যাচগুলি মুদ্রণের জন্য কনফিগার করেছি (লাইনফিড দ্বারা আলাদা)।
আসল রেজেক্স নিছক .*$। .*যে কোনও লাইনের সাথে মিল রয়েছে (সম্ভাব্য খালি), কারণ .লাইনফিড ছাড়া অন্য কোনও অক্ষরের সাথে মেলে। আমি $এক মিনিটের মধ্যে পৌঁছে যাব ।
আমরা কীভাবে এটি বিপরীতে ম্যাচগুলি মুদ্রণ করব? .NET- র ডান থেকে বামে ম্যাচিং মোডটি ব্যবহার করে, দিয়ে সক্রিয় করা হয়েছে r। এর অর্থ ম্যাচগুলি সন্ধান করার সময় এবং রেগেক্স ইঞ্জিনটি স্ট্রিংয়ের শেষে শুরু হয় এবং পিছনের দিকে কাজ করে।
অবশেষে, mতোলে $ম্যাচে শেষে লাইন স্ট্রিংয়ের শেষ প্রান্ত বদলে। কেন আমাদের এমনকি এটি প্রয়োজন? সমস্যাটি হচ্ছে .*বহিরাগত ম্যাচগুলি উত্পন্ন করে। রেজেক্স বিকল্পটি বিবেচনা করুন
s/a*/$0x/
ইনপুট প্রয়োগ baaababaa। আপনি ভাবেন যে baaaxbaxbaaxএটি পেতে পারে তবে এটি আপনাকে দেয় baaaxxbaxxbaaxx। কেন? কারণ aaaইঞ্জিনের কার্সারটি মিলানোর পরে aএবং এর মধ্যে রয়েছে b। এখন এটি আর আর মেলাতে পারে না a, তবে a*খালি স্ট্রিং দিয়ে সন্তুষ্ট। এর অর্থ, প্রতিটি একক ম্যাচের পরে আপনি আর একটি খালি ম্যাচ পান।
আমরা এখানে এটি চাই না, কারণ এটি অতিরিক্ত খালি রেখাগুলি প্রবর্তন করবে, তাই আমরা ম্যাচগুলির শেষে অন্তর্ভুক্ত করে ম্যাচগুলি আবশ্যক করে matches বাহ্যিক ম্যাচগুলি (যা লাইনগুলির শুরুতে ডান থেকে বাম মোডের কারণে রয়েছে) বাতিল করে দেই লাইন.
tacযখন পেছনের লাইনেফিড আসে তখন কিছুটা অদ্ভুত। এটিa\nb\n(ট্রেলিং লাইনফিড)b\na\nএবংa\nb(কোনও ট্রেলিং লাইনফিড) রূপান্তর করেba\n। আমাদের কোডটি এটি আচরণ করার কথা?