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