2009-10-28 14 views

उत्तर

19

आपके ऊपर के उदाहरण में ज्यादा अंतर (अधिकांश भाषाओं में) नहीं है। मुख्य अंतर यह है कि () संस्करण एक समूह बनाता है जिसे मैच में \1 द्वारा वापस संदर्भित किया जा सकता है (या, कभी-कभी, $1)। [] संस्करण ऐसा नहीं करता है।

इसके अलावा,

/(ab|cd)/ # matches 'ab' or 'cd' 
/[abcd]/ # matches 'a', 'b', 'c' or 'd' 
+2

() भी नाम के समूहों को निरूपित करने के लिए उपयोग किया जाता पुन: उपयोग –

+0

@rexem के लिए, -, हां, अपनी टिप्पणी से पहले इस बारे में सोचा और संपादित यह :) – Peter

+0

बस मुझे पंडिताऊ जा रहा है =) –

5

सबसे पहले, जब regexes के बारे में बात, यह अक्सर महत्वपूर्ण regexes किस तरह आप के बारे में बात कर रहे हैं निर्दिष्ट करने के लिए है। कई भिन्नताएं हैं (जैसे पारंपरिक पॉज़िक्स रेगेक्स, पर्ल और पर्ल-संगत रेगेक्स (पीसीआरई) इत्यादि)।

मान लिया जाये कि PCRE या बहुत कुछ इसी तरह है, जो अक्सर सबसे आम इन दिनों है, वहाँ तीन प्रमुख अंतर हैं:

  1. निक्षिप्त समूहों का उपयोग करना, आप एक से अधिक चरित्र से मिलकर विकल्पों की जांच कर सकते हैं। तो/(ए | बी)/हो सकता है इसके बजाय/(abc | defg) /।
  2. अभिभावक समूह एक कैप्चर ऑपरेशन करते हैं ताकि आप परिणाम निकाल सकें (ताकि यदि यह "बी" से मेल खाता हो, तो आप वापस "बी" प्राप्त कर सकते हैं और उसे देख सकते हैं)।/[एबी]/नहीं करता है। कैप्चर ऑपरेशन को जोड़कर ओवरराइड किया जा सकता है?: जैसे:/(?: a | b)/
  3. भले ही आप कोष्ठक के कैप्चर व्यवहार को ओवरराइड करते हैं, फिर भी अंतर्निहित कार्यान्वयन तब भी तेज़ हो सकता है जब आप जांच रहे हों एकल वर्ण (हालांकि कुछ भी नहीं कहता है कि गैर-कैप्चरिंग (?: ए | बी) को विशेष मामले के रूप में अनुकूलित नहीं किया जा सकता है [ab], लेकिन regex संकलन कभी इतना लंबा ले सकता है)।
6

नियमित अभिव्यक्ति में () नियमित अभिव्यक्तियों को समूहबद्ध करने के लिए उपयोग किया जाता है, जिससे आप एक चरित्र की बजाय पूरी अभिव्यक्ति को ऑपरेटरों को लागू करने की अनुमति देते हैं। उदाहरण के लिए, अगर मैं नियमित अभिव्यक्ति ab है, तो ab* एक a किसी भी (आदि उदाहरण के लिए, a, ab, abb,) b रों की संख्या से पीछा करने के लिए, संदर्भित करता है, जबकि (ab)* (अनुक्रम ab की पुनरावृत्ति के किसी भी संख्या को संदर्भित करता है उदाहरण के लिए, खाली स्ट्रिंग, ab, abab, आदि)। कई नियमित अभिव्यक्ति इंजनों में, () का उपयोग संदर्भ बनाने के लिए भी किया जाता है जिसे मिलान के बाद संदर्भित किया जा सकता है। उदाहरण के लिए, रुबी में, "foo" =~ /f(o*)/ निष्पादित करने के बाद, $1 में oo होगा।

| नियमित अभिव्यक्ति में वैकल्पिकता दर्शाता है; इसका मतलब बार से पहले अभिव्यक्ति, या उसके बाद अभिव्यक्ति है। आप 0|1|2|3|4|5|6|7|8|9 अभिव्यक्ति के साथ किसी भी अंक से मेल खा सकते हैं। उप-अभिव्यक्ति को समूहबद्ध करने या कैप्चर करने के प्रयोजनों के लिए आप अक्सर कोष्ठक के एक सेट में लिपटे विकल्प को देखेंगे, लेकिन इसकी आवश्यकता नहीं है। foo या bar को इंगित करने के लिए आप foo|bar जैसे लंबे अभिव्यक्तियों पर वैकल्पिकता का उपयोग कर सकते हैं।

आप में कुछ भी नहीं के साथ एक दूसरे के बगल हर नियमित अभिव्यक्ति (औपचारिक, सैद्धांतिक समझ, नहीं बढ़ाया अर्थ है कि कई भाषाओं का प्रयोग), बस प्रत्यावर्तन |, क्लीन बंद *, संयोजन (सिर्फ दो भाव लेखन के साथ व्यक्त कर सकते हैं बीच), और समूह के लिए ब्रांड्स।लेकिन जटिल अभिव्यक्तियों के लिए यह असुविधाजनक होगा, इसलिए कई शॉर्टेंड आमतौर पर उपलब्ध होते हैं। उदाहरण के लिए, x?|x (यानी खाली स्ट्रिंग या x) के लिए सिर्फ एक शॉर्टेंड है, जबकि y+yy* के लिए एक शॉर्टेंड है।

[] मूल रूप से सभी पात्रों, या वर्णों की श्रेणियों के वैकल्पिक | के लिए एक शॉर्टेंड हैं। जैसा कि मैंने कहा, मैं 0|1|3|4|5|6|7|8|9 लिख सकता था, लेकिन [0-9] लिखना अधिक सुविधाजनक है। मैं किसी भी पत्र का प्रतिनिधित्व करने के लिए [a-zA-Z] भी लिख सकता हूं। ध्यान दें कि [] समूह प्रदान करते समय, वे आमतौर पर एक नया संदर्भ प्रस्तुत नहीं करते जिसे बाद में संदर्भित किया जा सकता है; आप उस के लिए कोष्ठक में उन्हें लपेटो करने ([a-zA-Z])

तो तरह होता है, अपने दो उदाहरण नियमित अभिव्यक्ति से मेल खाते हैं कि वे क्या में बराबर हैं, किंतु (a|b), मिलान चरित्र के लिए सबसे पहले उप मैच सेट हो जाएगा, जबकि [ab] नहीं होगा सब-मैचों के लिए कोई संदर्भ बनाएं।

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