Regular Expressions
कब्जा समूह
खोज…
बुनियादी कैप्चर समूह
एक समूह कोष्ठकों ()
में संलग्न एक नियमित अभिव्यक्ति का एक खंड है। इसे आमतौर पर "उप-अभिव्यक्ति" कहा जाता है और दो उद्देश्यों को पूरा करता है:
- यह उप-अभिव्यक्ति को परमाणु बनाता है, अर्थात यह या तो पूरी तरह से मेल खाएगा, विफल होगा या दोहराएगा।
- मिलान किए गए पाठ का भाग शेष अभिव्यक्ति और कार्यक्रम के बाकी हिस्सों में पहुंच योग्य है।
समूह regex इंजन में क्रमांकित किए जाते हैं, 1. से शुरू होता है। परंपरागत रूप से, अधिकतम समूह संख्या 9 है, लेकिन कई आधुनिक regex जायके उच्च समूह गणनाओं का समर्थन करते हैं। समूह 0 हमेशा पूरे पैटर्न से मेल खाता है, उसी तरह ब्रैकेट के साथ पूरे रेगेक्स के आसपास।
प्रत्येक उद्घाटन कोष्ठक के साथ क्रमिक संख्या बढ़ जाती है, चाहे समूहों को एक के बाद एक रखा जाए या नेस्टेड किया जाए:
foo(bar(baz)?) (qux)+|(bla)
1 2 3 4
समूहों और उनकी संख्या
एक अभिव्यक्ति एक समग्र मैच प्राप्त करने के बाद, उसके सभी समूह उपयोग में होंगे - चाहे एक विशेष समूह कुछ भी मिलान करने में कामयाब रहा हो या नहीं।
एक समूह वैकल्पिक हो सकता है, जैसे (baz)?
ऊपर, या अभिव्यक्ति के एक वैकल्पिक हिस्से में जो मैच का उपयोग नहीं किया गया था, जैसे (bla)
ऊपर। इन मामलों में, गैर-मिलान समूहों में बस कोई जानकारी नहीं होगी।
यदि एक क्वांटिफायर एक समूह के पीछे रखा जाता है, जैसे (qux)+
ऊपर, अभिव्यक्ति का समग्र समूह गणना समान रहता है। यदि एक समूह एक से अधिक बार मेल खाता है, तो इसकी सामग्री अंतिम मैच की घटना होगी। हालांकि, आधुनिक रेगेक्स जायके सभी उप-मिलान घटनाओं तक पहुंचने की अनुमति देते हैं।
यदि आप लॉग प्रविष्टि की तिथि और त्रुटि स्तर को इस तरह प्राप्त करना चाहते हैं:
2012-06-06 12:12.014 ERROR: Failed to connect to remote end
आप कुछ इस तरह का उपयोग कर सकते हैं:
^(\d{4}-\d{2}-\d{2}) \d{2}:\d{2}.\d{3} (\w*): .*$
यह लॉग ग्रुप 2012-06-06
की तारीख को कैप्चर ग्रुप 1 और एरर लेवल ERROR
को कैप्चर ग्रुप 2 के रूप में ERROR
।
Backreferences और गैर-कैप्चरिंग समूह
चूंकि समूह "क्रमांकित" हैं, इसलिए कुछ इंजन मेल खाने का भी समर्थन करते हैं जो एक समूह ने पहले फिर से मिलान किया है।
यह मानते हुए कि आप कुछ मिलान करना चाहते हैं, जहां लंबाई तीन के दो बराबर तार आप द्वारा उपयोग किए जाने वाले $
द्वारा विभाजित हैं:
(.{3})\$\1
यह निम्नलिखित में से किसी भी तार से मेल खाता है:
"abc$abc"
"a b$a b"
"af $af "
" $ "
यदि आप चाहते हैं कि एक समूह इंजन द्वारा क्रमांकित न किया जाए, तो आप इसे गैर-कैप्चरिंग घोषित कर सकते हैं। एक गैर-कब्जा समूह इस तरह दिखता है:
(?:)
वे किसी भी समय किसी भी पैटर्न को दोहराने के लिए विशेष रूप से उपयोगी होते हैं, क्योंकि एक समूह को "परमाणु" के रूप में भी इस्तेमाल किया जा सकता है। विचार करें:
(\d{4}(?:-\d{2}){2} \d{2}:\d{2}.\d{3}) (.*)[\r\n]+\1 \2
यह समीपवर्ती लाइनों में दो लॉगिंग प्रविष्टियों से मेल खाएगा जिसमें समान टाइमस्टैम्प और समान प्रविष्टि है।
जिसका नाम कैप्चर ग्रुप रखा गया
कुछ नियमित अभिव्यक्ति फ्लेवर्स नामांकित समूहों को अनुमति देते हैं । एक संख्यात्मक सूचकांक के बजाय आप बाद के कोड में इन समूहों को संदर्भित कर सकते हैं, अर्थात् बैकरेफेरेंस में, बदले हुए पैटर्न में और साथ ही कार्यक्रम की निम्न पंक्तियों में।
न्यूमेरिकल इंडेक्स एक अभिव्यक्ति में समूहों की संख्या या व्यवस्था के रूप में बदलते हैं, इसलिए वे तुलना में अधिक भंगुर होते हैं।
उदाहरण के लिए, किसी एकल या दोहरे उद्धरण ( ['"]
) में संलग्न किसी शब्द ( \w+
) का मिलान करने के लिए, हम इसका उपयोग कर सकते हैं:
(?<quote>['"])\w+\k{quote}
जो इसके बराबर है:
(['"])\w+\1
इस तरह की एक साधारण स्थिति में, एक नियमित रूप से क्रमांकित कैप्चरिंग समूह के पास कोई ड्रा बैक नहीं होता है।
अधिक जटिल स्थितियों में नामित समूहों का उपयोग पाठक के लिए अभिव्यक्ति की संरचना को अधिक स्पष्ट कर देगा, जिससे स्थिरता में सुधार होता है।
लॉग फ़ाइल पार्सिंग एक अधिक जटिल स्थिति का एक उदाहरण है जो समूह नामों से लाभान्वित होता है। यह अपाचे कॉमन लॉग फॉर्मेट (CLF) है:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
निम्नलिखित अभिव्यक्ति भागों को नामित समूहों में कैद करती है:
(?<ip>\S+) (?<logname>\S+) (?<user>\S+) (?<time>\[[^]]+\]) (?<request>"[^"]+") (?<status>\S+) (?<bytes>\S+)
वाक्यविन्यास स्वाद पर निर्भर करता है, आम हैं:
-
(?<name>...)
-
(?'name'...)
-
(?P<name>...)
Backreferences:
-
\k<name>
-
\k{name}
-
\k'name'
-
\g{name}
-
(?P=name)
.NET फ्लेवर में आपके पास समान नाम साझा करने वाले कई समूह हो सकते हैं, वे कैप्चर स्टैक का उपयोग करेंगे।
PCRE में आपको (?J)
संशोधक ( PCRE_DUPNAMES
) का उपयोग करके या शाखा रीसेट समूह (?|)
का उपयोग करके इसे स्पष्ट रूप से सक्षम करना होगा। हालांकि केवल अंतिम कैप्चर किया गया मूल्य ही सुलभ होगा।
(?J)(?<a>...)(?<a>...)
(?|(?<a>...)|(?<a>...))