Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल रेगेक्स में कभी-कभी गैर लालची क्वांटिफायर क्यों काम नहीं करता है?

यह एक बग है!

आप सही कह रहे हैं कि पर्ल में, '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,

पैटर्न सुसंगत है:पहली घटना का लालच दूसरी घटना के लिए उपयोग किया जाता है चाहे वह होना चाहिए या नहीं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डेटाबेस में लॉग इन कैसे करें?

  2. क्या सत्र को मारे बिना ऑरैकल में एक प्रश्न को मारना संभव है?

  3. Oracle SQL डेवलपर का उपयोग करके टेक्स्ट फ़ाइल में CLOB निर्यात करना

  4. RMAN और ORA-00245 . के साथ स्नैपशॉट नियंत्रण फ़ाइल सुविधा

  5. ओरेकल में शनिवार, रविवार और छुट्टियों को छोड़कर 48 कार्य घंटों की तारीख कैसे खोजें?