2011-09-22 21 views
11

उदाहरण:क्या कुछ परिदृश्यों में क्वांटिफ़ायर {0} समझ में आता है?

/(?: फू) {0} बार/

मैं कुछ इस तरह एक और जवाब में देखा था। सबसे पहले मैंने सोचा कि "यह क्या होना चाहिए", लेकिन फिर, "ठीक हो सकता है, एक नकारात्मक नजरिया के पीछे", ताकि Foobar से पहले अनुमति नहीं है, लेकिन यह काम नहीं कर रहा है।

आप इस here on Regexr देख सकते हैं: यह केवल bar से मेल खाता है लेकिन यह भी Foobar में bar मेल खाता है।
जब मैं पंक्ति की शुरुआत के लिए एक लंगर जोड़ें:

/^(?:Foo){0}bar/ 

यह बर्ताव करता है जैसे मैं उम्मीद करते हैं। यह केवल bar से मेल खाता है और Foobar में bar से मेल नहीं खाता है।

लेकिन यह वही व्यवहार है जैसे मैंने केवल /bar/ या /^bar/ का उपयोग किया था।

क्या क्वांटिफायर {0} केवल एक बेकार साइड इफेक्ट है, या इसके लिए वास्तव में एक उपयोगी व्यवहार है?

उत्तर

11

अच्छे{0} के उपयोग हैं। यह आपको समूहों को परिभाषित करने की अनुमति देता है जिन्हें आप पर कैप्चर करने का इरादा नहीं रखते हैं। कुछ मामलों में यह उपयोगी हो सकता है:

  • सबसे अच्छा एक - पुनरावर्ती नियमित अभिव्यक्ति (या अन्य अजीब निर्माणों) में समूह का उपयोग। उदाहरण के लिए, पर्ल, उसी उपयोग के लिए (?(DEFINE)) है। परिणाम मैच के लिए एक असफल पर कब्जा कर लिया समूह (नाम या क्रमांकित) जोड़ना

    preg_match("/(?:(Foo)){0}bar(?1)/", "barFoo", $matches); 
    
  • : -
    एक त्वरित उदाहरण PHP में, इस से मेल खाएगी barFoo (working example)।

  • पैटर्न को दोबारा बनाए जाने के मामले में सभी समूहों के सूचकांक को बरकरार रखते हुए।

    • जेनरेट किए गए पैटर्न:

    कम अच्छा उपयोग करता है, के रूप में पीटर सुझाव में उपयोगी होते हैं।

  • पठनीयता - कुछ डुप्लिकेशन के साथ पैटर्न, जहां {0} और {1} सही दिशा में सोचने का कारण बन सकता है। (ठीक है, सबसे अच्छा बिंदु नहीं)

ये सभी दुर्लभ मामले हैं, और अधिकांश पैटर्न में यह एक गलती है।

+0

यह कमाल है, कोबी। यह केवल ऐसे इंजन में उपयोगी है जिसमें subroutines है लेकिन '(? (DEFINE)) नहीं, 'मुझे लगता है कि केवल रूबी और संभवतः पायगॉन' रेगेक्स 'मॉड्यूल के साथ है। रुबी में परीक्षण किया गया: '(? :(फू)) {0} बार \ g <1>' +1000! – zx81

+1

यदि कोई दिलचस्पी लेता है, तो पायथन में 'regex' मॉड्यूल के साथ काम नहीं कर रहा है। लेकिन इस विकल्प के साथ आया, जो काम करता है: '(? :(फू) $ ^)? बार (? 1)' – zx81

2

पारंपरिक नियमित अभिव्यक्ति में, /x{0}/ (भाषा = {x n: x = 0}) का मतलब होगा "मैच वास्तव में एक्स के 0" है, जो के रूप में // एक ही बात है (भाषा = {Λ})। चूंकि दोनों समकक्ष हैं, इसलिए आप किसी भी /x{0}/ को हटाने में सक्षम होना चाहिए जो आपको आसपास झूठ बोल रहा है।

लेकिन नियमित अभिव्यक्तियों के लिए पीसीआरई और अन्य एक्सटेंशन काफी बीजान्टिन प्राप्त कर सकते हैं। अगर /x{0}/ ने पर्ल में कुछ किया तो मुझे आश्चर्य नहीं होगा। मैं घृणित होगा, लेकिन आश्चर्यचकित नहीं होगा।

मुझे लगता है कि यह शायद एक प्रोग्राम का कुछ आर्टिफैक्ट है जो स्वचालित रूप से नियमित अभिव्यक्ति उत्पन्न करता है लेकिन उन्हें सरल नहीं करता है। जो शर्म की बात है, क्योंकि नियमित अभिव्यक्तियों को सरल बनाने वाले कार्यक्रमों को लिखना इतना आसान है।

+0

_ "मैं घृणा करता हूं, लेकिन आश्चर्यचकित नहीं होता।" _ :) –

+0

क्या नियमित रूप से अभिव्यक्तियों को सरल बनाने वाले प्रोग्राम लिखना वाकई इतना आसान है? यह दिलचस्प लगता है ... – Kobi

3

स्वचालित रूप से जेनरेट किए गए नियमित अभिव्यक्तियों में शून्य की एक स्पष्ट पुनरावृत्ति गणना उपयोगी हो सकती है। आप इस तरह शून्य पुनरावृत्ति के लिए एक विशेष मामला कोडिंग से बचें।

2

मैं x{0} का उपयोग करने के लिए एक भी अच्छे कारण के बारे में नहीं सोच सकता। लेकिन मैं कई लोगों के बारे में सोच सकता हूं कि इसे क्यों टालना चाहिए:

  • यह हमेशा बेकार है क्योंकि यह हमेशा मेल खाता है।
  • यह रेगेक्स इंजन को धीमा कर देता है (जब तक कि रेगेक्स प्रीकंपल न हो)।
  • शायद यह रेगेक्स लेखक द्वारा गलतफहमी का संकेत है।

मुझे यकीन है के लिए कोई है जो (?:foo){0} लिखते कोशिश कर कहने के लिए है, जो निश्चित रूप से विफल रहता है क्योंकि रिक्त स्ट्रिंग हमेशा मिलान किया जा सकता "यह सुनिश्चित करें कि foo यहाँ से मेल नहीं खाता बनाने के" है कि तैयार हूँ, चाहे foo वहाँ है या नहीं। नकारात्मक नकारात्मक विचारों के लिए यही है। (?<!foo)bar आदि

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