2011-05-31 16 views
7

क्या कोई मुझे बता सकता है कि [0-9]+ और [0-9]++ के बीच क्या अंतर है?[0-9] + और [0-9] ++ के बीच क्या अंतर है?

+2

यह काफी डुप्लिकेट नहीं है, लेकिन सवाल का जवाब देना चाहिए: http://stackoverflow.com/questions/4489551/what-is-double-plus-in-regular-expressions – Spudley

+0

मैंने कभी ' ++ 'regex में, और ऐसा लगता है कि बहुत से अन्य लोगों के पास नहीं है, लेकिन खुदाई का एक छोटा सा दिखाता है कि यह मान्य है। – Spudley

+0

क्षमा करें, मुझे वह नहीं मिला। – user557108

उत्तर

14

PCRE इंजन है, जो पीएचपी नियमित अभिव्यक्ति के लिए उपयोग करता है, "possessive quantifiers" समर्थन करता है:

Quantifiers + के बाद "अधिकार" कर रहे हैं। वे जितना संभव हो सके उतने पात्र खाते हैं और शेष पैटर्न से मेल नहीं खाते हैं। इस प्रकार .*abc मैचों "aabc" लेकिन .*+abc इसलिए नहीं है क्योंकि .*+ संपूर्ण स्ट्रिंग खाती है। प्रसंस्करण को तेज करने के लिए संभावित क्वांटिफायर का उपयोग किया जा सकता है।

और:

PCRE_UNGREEDY विकल्प (जो पर्ल में उपलब्ध नहीं है एक विकल्प है) तो परिमाणकों डिफ़ॉल्ट रूप से लालची नहीं हैं, लेकिन अलग-अलग लोगों को उन लोगों के साथ पालन करते हुए लालची बनाया जा सकता है सेट है, तो एक प्रश्न चिह्न। दूसरे शब्दों में, यह डिफ़ॉल्ट व्यवहार को बदल देता है।

अंतर इस प्रकार है:

/[0-9]+/ - one or more digits; greediness defined by the PCRE_UNGREEDY option 
/[0-9]+?/ - one or more digits, but as few as possible (non-greedy) 
/[0-9]++/ - one or more digits, but as many as possible (greedy, default) 

This snippet अंतर visualises जब लालची-दर-डिफ़ॉल्ट मोड में। ध्यान दें कि पहला स्निपेट अंतिम रूप से अंतिम जैसा ही है, क्योंकि अतिरिक्त + डिफ़ॉल्ट रूप से पहले से लागू होता है (एक अर्थ में)।

This snippet पीसीRE_UNGREEDY (अविभाज्य-डिफ़ॉल्ट-डिफ़ॉल्ट मोड) लागू करते समय अंतर को दर्शाता है। देखें कि डिफ़ॉल्ट कैसे उलट है।

+0

यह क्यों कम हो गया है? सवाल मूल रूप से 'php' टैग था। – thirtydot

+0

@ थर्डडॉट: और यह अभी भी करता है। –

+2

केवल इसलिए कि मैंने इसे वापस जोड़ा :) – thirtydot

4

++ (और ?+, *+ और {n,m}+) possessive quantifiers कहा जाता है।

दोनों [0-9]+ और [0-9]++ मैच एक या अधिक ASCII अंक है, लेकिन दूसरा एक regex इंजन मैच में पीछे की कि यदि आवश्यक हो तो हो जाना चाहिए के लिए समग्र regex सफल होने के लिए अनुमति नहीं दी जाएगी।

उदाहरण:

[0-9]+0 

, स्ट्रिंग 00 से मेल खाता है, जबकि [0-9]++0 नहीं करता है।

पहले मामले में, [0-9]+ पहले 00 से मेल खाता है, लेकिन फिर मिलान करने के लिए निम्नलिखित 0 को अनुमति देने के लिए एक वर्ण बैकट्रैक करता है। दूसरे मामले में, ++ इसे रोकता है, इसलिए पूरा मिलान विफल रहता है।

सभी रेगेक्स स्वाद इस वाक्यविन्यास का समर्थन नहीं करते हैं; कुछ अन्य इसके बजाय atomic groups लागू करते हैं (या यहां तक ​​कि दोनों)।

+0

आपके उत्तर के लिए धन्यवाद! – user557108

संबंधित मुद्दे