जावा रेगेक्स कैप्चरिंग ग्रुप इंडेक्स


113

मेरी निम्न पंक्ति है,

typeName="ABC:xxxxx;";

मुझे शब्द लाने की आवश्यकता है ABC,

मैंने निम्नलिखित कोड स्निपेट लिखा है,

Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);

String nameStr="";
if(matcher.find())
{
    nameStr=matcher.group(1);

}

इसलिए अगर मैं लगाता group(0)हूं, ABC:लेकिन अगर मैं group(1)इसे लगाऊंगा ABC, तो मैं जानना चाहता हूं

  1. इसका क्या मतलब 0और क्या 1मतलब है? बेहतर होगा कि कोई भी मुझे अच्छे उदाहरणों के साथ समझा सके।

  2. रेगेक्स पैटर्न में एक समाहित है :, इसलिए group(1)परिणाम क्यों छोड़ता है? क्या समूह 1 कोष्ठक के अंदर सभी शब्दों का पता लगाता है?

  3. तो, अगर मैं दो और कोष्ठक लगाऊं, जैसे \\s*(\d*)(.*): तो, क्या दो समूह होंगे? group(1)वापस आ जाएगी (\d*)हिस्सा है और group(2)वापसी (.*)हिस्सा है?

मेरा भ्रम दूर करने के उद्देश्य से कोड स्निपेट दिया गया था। यह वह कोड नहीं है जिसके साथ मैं काम कर रहा हूं। ऊपर दिए गए कोड को String.split()बहुत आसान तरीके से किया जा सकता है ।

जवाबों:


182

पकड़ना और समूह बनाना

कैप्चरिंग समूह (pattern) एक बनाता है समूह है कि गया है पर कब्जा संपत्ति।

एक संबंधित जिसे आप अक्सर देख सकते हैं (और उपयोग करते हैं) (?:pattern), जो संपत्ति पर कब्जा किए बिना एक समूह बनाता है , इसलिए गैर-कैप्चरिंग समूह नाम दिया गया है ।

एक समूह आम तौर पर जब आप पैटर्न, जैसे की एक अनुक्रम दोहराने की आवश्यकता प्रयोग किया जाता है (\.\w+)+, या जहां प्रत्यावर्तन प्रभाव, जैसे लेना चाहिए निर्दिष्ट करने के लिए ^(0*1|1*0)$( ^है, तो 0*1या 1*0, तो $बनाम) ^0*1|1*0$( ^0*1या 1*0$)।

एक कैप्चरिंग ग्रुप, ग्रुपिंग के अलावा कैप्चरिंग ग्रुप के अंदर पैटर्न द्वारा मैच किए गए टेक्स्ट को भी रिकॉर्ड करेगा (pattern)। अपने उदाहरण का उपयोग करना, (.*):, .*मैचों ABCऔर :मैचों :, और के बाद से .*समूह पर कब्जा करने के अंदर है (.*), पाठ ABCकैप्चरिंग समूह 1 के लिए दर्ज की गई है।

समूह संख्या

पूरे पैटर्न को समूह संख्या 0 के रूप में परिभाषित किया गया है।

पैटर्न में कोई भी कैप्चरिंग ग्रुप 1. से इंडेक्सिंग शुरू करता है। इंडेक्स को कैप्चरिंग ग्रुप के ओपनिंग कोष्ठक के क्रम से परिभाषित किया जाता है । एक उदाहरण के रूप में, नीचे दिए गए पैटर्न में सभी 5 कैप्चरिंग समूह हैं:

(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
|     |                       |          | |      |      ||       |     |
1-----1                       |          | 4------4      |5-------5     |
                              |          3---------------3              |
                              2-----------------------------------------2

समूह संख्या का उपयोग \nपैटर्न में बैक-रेफरेंस और $nप्रतिस्थापन स्ट्रिंग में किया जाता है।

अन्य रेगेक्स फ्लेवर (पीसीआरई, पर्ल) में, उन्हें उप-रूटीन कॉल में भी इस्तेमाल किया जा सकता है ।

आप कुछ समूह द्वारा मेल किए गए पाठ तक पहुँच सकते हैं Matcher.group(int group)। समूह संख्या को ऊपर बताए गए नियम से पहचाना जा सकता है।

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

समूह का नाम

जावा 7 से, आप एक नामित कैप्चरिंग समूह को परिभाषित कर सकते हैं (?<name>pattern), और आप मिलान की गई सामग्री तक पहुँच सकते हैं Matcher.group(String name)। रेगेक्स लंबा है, लेकिन कोड अधिक सार्थक है, क्योंकि यह इंगित करता है कि आप रेगेक्स के साथ मैच या निकालने की कोशिश कर रहे हैं।

समूह के नाम \k<name>पैटर्न में बैक-रेफरेंस में और ${name}प्रतिस्थापन स्ट्रिंग में उपयोग किए जाते हैं।

नामांकित कैप्चरिंग समूहों को अभी भी एक ही नंबरिंग स्कीम के साथ गिना जाता है, इसलिए उन्हें भी एक्सेस किया जा सकता है Matcher.group(int group)

आंतरिक रूप से, जावा के कार्यान्वयन में नाम से लेकर समूह संख्या तक के नक्शे हैं। इसलिए, आप 2 अलग-अलग कैप्चरिंग समूहों के लिए एक ही नाम का उपयोग नहीं कर सकते हैं।


1
वाह! नॉन-कैप्चरिंग ग्रुप्स को समझाने के लिए @nhahtdh का धन्यवाद कि कैसे नेस्टिंग ग्रुप ऑर्डर काम करता है। मैं इस बात पर अडिग था कि समूह संख्याएँ तब तक कैसे काम करती हैं जब तक कि मैं अंत में आपका स्पष्टीकरण नहीं पढ़ लेता। आपका बहुत बहुत धन्यवाद!
एमएमएच

92

बाकी हमारे लिए

यहाँ एक सरल और स्पष्ट उदाहरण है कि यह कैसे काम करता है

regex: ([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+)

स्ट्रिंग: "!* UserName10 John Smith 01123 *!"

group(0): UserName10 John Smith 01123
group(1): UserName10
group(2):  
group(3): John Smith
group(4):  
group(5): 01123

जैसा कि आप देख सकते हैं, मैंने पाँच समूह बनाए हैं जो प्रत्येक कोष्ठक में संलग्न हैं।

मैं शामिल! * और * दोनों तरफ यह स्पष्ट करने के लिए। ध्यान दें कि उन वर्णों में से कोई भी RegEx में नहीं है और इसलिए परिणामों में इसका उत्पादन नहीं किया जाएगा। समूह (0) केवल आपको संपूर्ण मिलान स्ट्रिंग (एक पंक्ति में मेरे सभी खोज मापदंड) देता है। समूह 1 पहली जगह से ठीक पहले बंद हो जाता है क्योंकि अंतरिक्ष चरित्र खोज मानदंडों में शामिल नहीं था। समूह 2 और 4 केवल सफ़ेद स्थान हैं, जो इस मामले में वस्तुतः एक अंतरिक्ष वर्ण है, लेकिन यह एक टैब या एक पंक्ति फ़ीड भी हो सकता है आदि समूह 3 में स्थान शामिल है क्योंकि मैंने इसे खोज मानदंडों में रखा है ... आदि।

आशा है कि यह समझ में आता है।


1
सही उदाहरण जो शुरुआती लोगों के लिए समझना आसान है। मुझे संदेह है कि यह वही है जैसे कि अजगर में reg पूर्व समूहन? या कोई और अंतर है? मैं पूर्व के लिए नया हूँ इसलिए मैं दोनों भाषाओं में थोड़ा भ्रमित हूँ।
मणि

1
यह एक वैध जावा रेगेक्स नहीं है: बैकस्लैश को दोगुना किया जाना चाहिए।
निकोलस राउल

1
@ नाइकोलास राउल: डबल बैकस्लैश स्ट्रिंग शाब्दिक में भागने के सिंटैक्स के कारण है। वास्तविक रेगेक्स सिंटैक्स (यानी यदि आप कंसोल को रेगेक्स युक्त स्ट्रिंग प्रिंट करते हैं) को डबल बैकस्लैश की आवश्यकता नहीं है।
न्हाथ्ठ

यदि आप एक सक्षम IDE का उपयोग करके वास्तविक जावा कोड में मेरे regex स्ट्रिंग को कॉपी और पेस्ट करना चाहते हैं, तो IDE ठीक से भागने के स्लैश को प्रारूपित करेगा। लेकिन मेरा रेगेक्स तकनीकी रूप से और सही रूप से सही है और यह मुख्य उद्देश्य है जो रेगेक्स कोड और प्राप्त परिणामों के बीच सहयोग को प्रदर्शित करता है (एक बहुत ही विशिष्ट उदाहरण का उपयोग करके) ... थोड़ा हल्का करें ... ☺
माइकल सिम्स

44

कोष्ठक ()का उपयोग रेगेक्स वाक्यांशों के समूहन को सक्षम करने के लिए किया जाता है।

group(1)स्ट्रिंग कोष्ठक के बीच है कि होता है (.*)तो .*इस मामले में

और group(0)पूरे मिलान स्ट्रिंग शामिल हैं।

यदि आपके पास अधिक समूह होंगे (पढ़ें (...)) तो इसे अगले सूचकांक (2, 3 और इसी तरह) वाले समूहों में रखा जाएगा।


2
इसलिए, मैं सही हूं कि कोष्ठक जोड़ना वास्तव में समूह बनाने के लिए है?
पी बसक

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