জাভাস্ক্রিপ্টে রেগুলার এক্সপ্রেশনে লোভ সীমিত করা

রেগুলার এক্সপ্রেশন ডিফল্টরূপে লোভী। এর মানে হল, তারা সর্বাধিক সম্ভাব্য সংখ্যক অক্ষর ক্যাপচার করে। আসুন একটি উদাহরণ দিয়ে বুঝুনি। ধরুন আমাদের কাছে এইরকম একটি স্ট্রিং আছে:

javascriptlet str = 'aeeex zzz x kkk';

ধরুন আমরা এই স্ট্রিংটিতে সাবস্ট্রিং 'aeeex' খুঁজে পেতে চাই নিম্নলিখিত প্যাটার্ন অনুসারে: অক্ষর 'a', তারপর যেকোনো অক্ষর এক বা তার বেশি বার, তারপর অক্ষর 'x'।

javascriptlet res = str.replace(/a.+x/g, '!');

আমরা আশা করি যে ভেরিয়েবলে ফলাফল হিসেবে '! zzz x kkk' স্ট্রিংটি লেখা হবে। তবে, তা নয় - ভেরিয়েবলে স্ট্রিংটি '! kkk' আসে।

সমস্যা হল যে আমাদের রেগুলার এক্সপ্রেশন 'a' অক্ষর থেকে 'x' অক্ষর পর্যন্ত সমস্ত অক্ষর খুঁজে বের করে। কিন্তু আমাদের স্ট্রিংয়ে দুটি 'x' অক্ষর আছে! লোভের কারণে ঘটে যে রেগুলার এক্সপ্রেশন শেষ 'x' পর্যন্ত খুঁজে বের করে, যার ফলে এটি আমরা যা আশা করি তা না ধরে অন্য কিছু ধরে।

অবশ্যই, বেশিরভাগ ক্ষেত্রে এই আচরণই আমাদের দরকার। কিন্তু এই বিশেষ ক্ষেত্রে আমরা লোভ বাতিল করতে চাই এবং রেগুলার এক্সপ্রেশনকে বলতে চাই যে এটি প্রথম 'x' পর্যন্ত খুঁজে বের করুক।

লোভ সীমিত করতে, পুনরাবৃত্তি অপারেটরের পরে প্রশ্ন চিহ্ন দিতে হবে:

javascriptlet res = str.replace(/a.+?x/g, '!');

সব পুনরাবৃত্তি অপারেটরের জন্য লোভ সীমিত করা যায়: *, ?, এবং {} - এভাবে: *?, ?? এবং {}?।

Задание 1

একটি স্ট্রিং দেওয়া আছে:

javascriptlet str = 'aba accca azzza wwwwa';

একটি রেগুলার এক্সপ্রেশন লিখুন যা সমস্ত স্ট্রিং খুঁজে পাবে যার দুপাশে 'a' অক্ষর আছে, এবং তাদের প্রতিটিকে '!' দিয়ে প্রতিস্থাপন করবে। 'a' অক্ষরের মধ্যে যেকোনো অক্ষর থাকতে পারে ('a' ছাড়া)।