यह एक बग है!
आप सही कह रहे हैं कि पर्ल में, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $&
प्रिंट करता है A=1,B=2,
आपने जो ठोकर खाई है वह एक बग है जो अभी भी Oracle डेटाबेस 11g R2 में मौजूद है। यदि एक ही रेगुलर एक्सप्रेशन परमाणु (क्वांटिफायर सहित लेकिन लालच संशोधक को छोड़कर) एक रेगुलर एक्सप्रेशन में दो बार दिखाई देता है, तो दोनों घटनाओं में पहली उपस्थिति से संकेतित लालच होगा, भले ही दूसरे द्वारा निर्दिष्ट लालच की परवाह किए बिना। यह एक बग है जो इन परिणामों से स्पष्ट रूप से प्रदर्शित होता है (यहाँ, "ठीक वही रेगुलर एक्सप्रेशन परमाणु" [^B]*
है ):
SQL> SELECT regexp_substr('A=1,B=2,C=3,', '[^B]*B=[^Bx]*?,') as good FROM dual;
GOOD
--------
A=1,B=2,
SQL> SELECT regexp_substr('A=1,B=2,C=3,', '[^B]*B=[^B]*?,') as bad FROM dual;
BAD
-----------
A=1,B=2,C=3,
दो नियमित अभिव्यक्तियों के बीच एकमात्र अंतर यह है कि "अच्छा" दूसरी मिलान सूची में संभावित मिलान के रूप में 'x' को बाहर कर देता है। चूंकि 'x' लक्ष्य स्ट्रिंग में प्रकट नहीं होता है, इसे छोड़कर कोई फर्क नहीं पड़ना चाहिए, लेकिन जैसा कि आप देख सकते हैं, 'x' को हटाने से बहुत फर्क पड़ता है। यह एक बग होना चाहिए।
Oracle 11.2 के कुछ और उदाहरण यहां दिए गए हैं:(SQL Fiddle और भी अधिक उदाहरणों के साथ )
SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.*?,') FROM dual; => A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.*,') FROM dual; => A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.*?B=.*?,') FROM dual; => A=1,B=2,
SELECT regexp_substr('A=1,B=2,C=3,', '.*?B=.*,') FROM dual; => A=1,B=2,
-- Changing second operator from * to +
SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.+?,') FROM dual; => A=1,B=2,
SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.+,') FROM dual; => A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.+B=.+,') FROM dual; => A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.+?B=.+,') FROM dual; => A=1,B=2,
पैटर्न सुसंगत है:पहली घटना का लालच दूसरी घटना के लिए उपयोग किया जाता है चाहे वह होना चाहिए या नहीं।