जावास्क्रिप्ट में रेगुलर एक्सप्रेशन की लालच को सीमित करना
रेगुलर एक्सप्रेशन डिफ़ॉल्ट रूप से लालची होते हैं। इसका मतलब है कि वे अधिकतम संभव वर्णों को कैप्चर करते हैं। आइए एक उदाहरण से समझते हैं। मान लीजिए कि हमारे पास ऐसी स्ट्रिंग है:
let str = 'aeeex zzz x kkk';
मान लीजिए कि हम इस स्ट्रिंग में सबस्ट्रिंग
'aeeex' को निम्नलिखित पैटर्न के अनुसार ढूंढना चाहते हैं: अक्षर
'a', फिर कोई भी वर्ण एक या अधिक
बार, फिर अक्षर 'x'।
let res = str.replace(/a.+x/g, '!');
हम उम्मीद करते हैं कि परिणामस्वरूप वेरिएबल में
स्ट्रिंग '! zzz x kkk' लिखी जाएगी। हालाँकि,
ऐसा नहीं है - वेरिएबल में स्ट्रिंग
'! kkk' आती है।
इसका कारण यह है कि हमारा रेगुलर एक्सप्रेशन
अक्षर 'a' से अक्षर 'x' तक सभी
वर्णों को खोजता है।
लेकिन हमारी स्ट्रिंग में दो अक्षर 'x' हैं! लालच के कारण
ऐसा होता है कि रेगुलर एक्सप्रेशन आखिरी
एक्स तक खोजता है, जिससे वह
वह नहीं कैप्चर कर पाता जिसकी हमें उम्मीद थी।
बेशक, अक्सर ऐसा व्यवहार हमें चाहिए भी होता है। लेकिन इस विशेष मामले में हम लालच को रद्द करना चाहेंगे और रेगुलर एक्सप्रेशन को बताना चाहेंगे कि वह पहले एक्स तक खोजे।
लालच को सीमित करने के लिए, रिपीटिशन ऑपरेटर के बाद प्रश्न चिह्न लगाना होता है:
let res = str.replace(/a.+?x/g, '!');
लालच को सभी रिपीटिशन ऑपरेटर्स के लिए सीमित किया जा सकता है:
चाहे * हो, ? हो, या {}
- इस तरह: *?, ?? और {}?।
एक स्ट्रिंग दी गई है:
let str = 'aba accca azzza wwwwa';
एक रेगुलर एक्सप्रेशन लिखें जो सभी स्ट्रिंग्स ढूंढे
जिनके किनारों पर अक्षर 'a' हों,
और उनमें से प्रत्येक को '!' से बदल दे।
अक्षरों 'a' के बीच
कोई भी वर्ण हो सकता है (सिवाय
'a' के)।