2013-01-08 44 views
6

किसी .+ और .+?"। +" और "। +?" के बीच अंतर

के बीच अंतर के बारे में समझाएं सकते हैं कि मैं स्ट्रिंग है: "extend cup end table"

  1. पैटर्न e.+d पाता: extend cup end
  2. पैटर्न e.+?d पाता: extend और end

मुझे पता है कि + एक या अधिक है और ? एक या शून्य है। लेकिन मुझे समझ में नहीं आता कि यह कैसे काम करता है।

+0

जैसा कि नीचे बताया गया है, यह लालची और आलसी क्वांटिफायर के बीच का अंतर है। लालची जितना संभव हो उतना आलसी, आलसी जितना संभव हो उपभोग करना चाहता है। क्वांटिफायर आलसी होने पर इंजन बाएं से दाएं, चरित्र से 'स्ट्रिंग का निर्माण' चरित्र करेगा। लालची विपरीत करेंगे।यह जितना संभव हो उतना उपभोग करेगा और फिर कुछ वर्णों को दाएं से बाएं, यदि इसे करना है तो छोड़ दें। निम्नलिखित उदाहरण देखें: http://regex101.com/r/dG9zZ2 और http://regex101.com/r/tP5xQ3 –

उत्तर

16

दोनों एक या एक से अधिक वर्णों के किसी भी अनुक्रम से मेल खाते हैं।

  • .+लालची है और यह कर सकते हैं के रूप में कई पात्रों की खपत: अंतर यह है कि है।
  • .+?अनिच्छुक है और जितना संभव हो उतना पात्रों का उपभोग करता है।

जावा ट्यूटोरियल में Differences Among Greedy, Reluctant, and Possessive Quantifiers देखें।

इस प्रकार:

  • e.+d सबसे लंबे समय तक सबस्ट्रिंग कि e साथ शुरू होता है और d साथ समाप्त होता है (और बीच में कम से कम एक वर्ण है) पाता है।
  • e.+?d सबसे कम ऐसी सबस्ट्रिंग पाएं। आपके उदाहरण में, extend और end ऐसे दो गैर-ओवरलैपिंग मैचों हैं, इसलिए यह दोनों पाता है।
+0

बस rubular.com पर अभिव्यक्तियों का परीक्षण किया, और मैं वास्तव में थोड़ा परेशान क्यों हूं? अभिव्यक्ति "कप" को अनदेखा करता है। आपका जवाब वास्तव में विस्तार से नहीं समझाता है, यद्यपि। क्या इसके बारे में एक पंक्ति या दो जोड़ना संभव होगा? – Henrik

+0

@ हेनरिक परिणाम इस तरह था, मूल प्रश्न में अजीब प्रारूपण था जिसे मैं पहली बार कोशिश करने में सही ढंग से संपादित करने में विफल रहा – Kapep

5

regex e.+?d एक 'e' से मेल खाता है और फिर संभव (ungreedy या अनिच्छुक) के रूप में के रूप में कुछ वर्णों का मिलान करने की कोशिश करता है, एक 'd' द्वारा पीछा किया। यही कारण है कि निम्नलिखित 2 सबस्ट्रिंग मिलान किया जाता है:

extend cup end table 
^^^^^^  ^^^ 
    1   2 

regex e.+d एक 'e' से मेल खाता है और फिर के रूप में संभव (लालची) के रूप में ज्यादा वर्णों का मिलान करने की कोशिश करता है, एक 'd' द्वारा पीछा किया।

extend cup end table 
^^^^^^^^^^^^^^^^^^^^ 

regex इंजन पंक्ति के अंत की बात आती है (: क्या होता है कि पहले 'e' पाया जाता है, और फिर .+ मैचों यह कर सकते हैं जितना (पंक्ति के अंत, या इनपुट तक) है या इनपुट) और regex-pattern में 'd' से मेल नहीं खा सकता है। तो यह पिछले 'd' पर बैकट्रैक देखा गया है। यही कारण है कि एकल मैच पाया जाता है:

extend cup end table 
^^^^^^^^^^^^^^<----- backtrack 
    1  
संबंधित मुद्दे