Regex प्लस बनाम स्टार अंतर?


90

दोनों के बीच क्या अंतर है:

(.+?)

तथा

(.*?)

जब मैं इसे अपने php preg_matchregex में उपयोग करता हूँ ?

जवाबों:


150

उन्हें क्वांटिफायर कहा जाता है।

* पूर्ववर्ती अभिव्यक्ति के 0 या अधिक

+ पूर्ववर्ती अभिव्यक्ति के 1 या अधिक

डिफ़ॉल्ट रूप से एक क्वांटिफायर लालची होता है, इसका मतलब है कि यह अधिक से अधिक पात्रों से मेल खाता है।

?एक परिमाणक के बाद व्यवहार में परिवर्तन इस परिमाणक "ungreedy" बनाने के लिए, साधन यह संभव के रूप में छोटे रूप में भरपाई कर देंगे।

उदाहरण लालची / अकुशल

स्ट्रिंग "पर उदाहरण के लिए ABAB "

a.*b मैच "अबाब" (प्रीग_मैच_आल एक मैच, "अबाब" लौटाएगा

जबकि a.*?bकेवल "अब" शुरू होगा (preg_match_all दो मैच लौटाएगा, "ab"

आप अपने regexes का ऑनलाइन परीक्षण कर सकते हैं जैसे Regexr पर, यहाँ लालची उदाहरण देखें


2
"आलसी" "
लालची

उदाहरण गलत है। दोनों (.+?)और (.*?)नियमित अभिव्यक्ति कर रहे हैं जिनमें से एक विभिन्न स्थिति में अलग तरह से व्यवहार a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b
लुई ५५

क्यों नहीं होगा। * b वापस "ab" दें? क्या यह नहीं कह रहा है कि "एक और बी, 0 या अधिक वर्णों के बीच का शब्द", इसलिए, ab के बीच शून्य वर्ण है और एक मैच हो सकता है। यह गलत क्यों है?
हैलो वर्ल्ड

@ हेलोवर्ल्ड, यह मुझे ऊपर बताए गए लालच के साथ करना है। .*जितना संभव हो सकेगा। यदि आप जल्द से जल्द रोकना चाहते हैं, तो आपको इसे .*?
अप्राकृतिक

22

पहला ( +) एक या एक से अधिक वर्ण हैं । दूसरा ( *) शून्य या अधिक वर्ण है । दोनों गैर-लालची हैं ( ?) और कुछ भी मैच ( .)।


1
यह निर्भर करता है कि s संशोधक सेट है या नहीं।
क्वेंटिन

8

एक +से मेल खाता है एक या अधिक पूर्ववर्ती पैटर्न के उदाहरण। एक पूर्ववर्ती पैटर्न के शून्य या अधिक उदाहरणों से *मेल खाता है

मूल रूप से, यदि आप उपयोग करते हैं तो +पैटर्न का कम से कम एक उदाहरण होना चाहिए, यदि आप इसका उपयोग करते हैं *तो यह तब भी मेल खाएगा यदि इसके कोई उदाहरण नहीं हैं।


8

+ कम से कम एक पात्र से मेल खाता है

* किसी भी संख्या (वर्णों सहित) से मेल खाता है

?एक आलसी अभिव्यक्ति को इंगित करता है, तो यह संभव के रूप में कुछ पात्रों के रूप में मेल खाएगी।


8

नीचे विचार करें कि मिलान करने के लिए स्ट्रिंग है।

ab

पैटर्न (ab.*)परिणाम के साथ कैप्चर समूह के लिए एक मैच लौटाएगाab

जबकि पैटर्न (ab.+)मैच नहीं करेगा और कुछ भी नहीं लौटाएगा।

लेकिन यदि आप स्ट्रिंग को निम्नलिखित में बदलते हैं, तो यह abaपैटर्न के लिए वापस आ जाएगा(ab.+)

aba

मुझे लगता है कि यह विशेष रूप से + बनाम *
टेरेंस


5

रेगुलर एक्सप्रेशन से में {i,f}"के बीच का मतलब iकरने के लिए fमैच"। आइए निम्नलिखित उदाहरणों पर एक नज़र डालें:

  • {3,7} 3 से 7 मैचों के बीच का मतलब है
  • {,10} 10 से कम मैचों का मतलब बिना किसी सीमित सीमा के (यानी कम सीमा 0 है)
  • {3,} कम से कम 3 मैच बिना ऊपरी सीमा के (यानी उच्च सीमा अनंत है)
  • {,} मैचों की संख्या के लिए कोई ऊपरी सीमा या निचली सीमा नहीं है (अर्थात निचली सीमा 0 है और ऊपरी सीमा अनंत है)
  • {5} मतलब बिल्कुल 4

अधिकांश अच्छी भाषाओं में संक्षिप्तियाँ होती हैं, इसलिए RegEx:

  • + के लिए आशुलिपि है {1,}
  • * के लिए आशुलिपि है {,}
  • ? के लिए आशुलिपि है {,1}

इस साधन के +लिए कम से कम 1 मैच की आवश्यकता होती है, जबकि *किसी भी संख्या में कोई भी मैच या कोई मैच ?स्वीकार नहीं करता है और 1 से अधिक मैचों या शून्य मैचों को स्वीकार नहीं करता है।

साभार: Codecademy.com


4

एक तारा एक प्लस से बहुत मिलता-जुलता है, केवल अंतर यह है कि जब प्लस 1 या उससे अधिक पूर्ववर्ती वर्ण / समूह से मेल खाता है, तो स्टार 0 या अधिक से मेल खाता है।


2

मुझे लगता है कि पिछले जवाब एक सरल उदाहरण को उजागर करने में विफल रहे:

उदाहरण के लिए हमारे पास एक सरणी है:

numbers = [5, 15]

निम्नलिखित रेगेक्स अभिव्यक्ति ^[0-9]+मेल खाती है: 15केवल। हालाँकि, ^[0-9]*दोनों में मेल खाता है 5 and 15। अंतर यह है कि +ऑपरेटर को पूर्ववर्ती रेगेक्स अभिव्यक्ति के कम से कम एक डुप्लिकेट की आवश्यकता होती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.