2017-06-03 17 views
8

मेरे पास कोड से नीचे है और जिसमें मैं Matcher.group() का उपयोग कर स्ट्रिंग में सभी मैचों को मुद्रित करने का प्रयास कर रहा हूं। कोई समूह 2 अपवाद:Matcher.group क्यों फेंक रहा है IndexOutOfBoundsException अपवाद

public static void main(String[] args) { 
     String s = "foo\r\nbar\r\nfoo" 
       + "foo, bar\r\nak = " 
       + "foo, bar\r\nak = " 
       + "bar, bar\r\nak = " 
       + "blr05\r\nsdfsdkfhsklfh"; 
     //System.out.println(s); 
     Matcher matcher = Pattern.compile("^ak\\s*=\\s*(\\w+)", Pattern.MULTILINE) 
       .matcher(s); 
     matcher.find(); 
     // This one works 
     System.out.println("first match " + matcher.group(1)); 
     // Below 2 lines throws IndexOutOfBoundsException 
     System.out.println("second match " + matcher.group(2)); 
     System.out.println("third match " + matcher.group(3)); 

    } 

कोड से ऊपर धागा "मुख्य" java.lang.IndexOutOfBoundsException में अपवाद फेंकता है।

तो मेरा सवाल यह है कि Matcher.group() काम करता है और जैसा कि आप देख सकते हैं कि मेरे पास 3 मिलान करने वाली स्ट्रिंग होगी, मैं group() का उपयोग करके उन सभी को कैसे प्रिंट कर सकता हूं।

+0

आप ब्रेकपॉइंट को एक निरीक्षण करना चाहते हैं कि 'matcher' क्या है, कैसे' समूह 'और' ढूंढें 'इंटरैक्ट, आदि – luk2302

+0

@ luk2302, मैंने डीबगर का उपयोग किया लेकिन मुझे पता नहीं था कि' समूह 'और' कैसे ' 'इंटरैक्ट, –

उत्तर

7

यह स्पष्ट है आप केवल एक समूह है कि:

^ak\\s*=\\s*(\\w+) 
//   ^----^----------this is the only group 

बजाय आप उदाहरण के लिए एक पाश का उपयोग करना होगा:

while(matcher.find()){ 
    System.out.println("match " + matcher.group()); 
} 

आउटपुट

match = foo 
match = bar 
match = blr05 

पढ़ के बारे में groups:

कैप्चरिंग समूह

कोष्ठक समूह उन दोनों के बीच regex। वे उनके अंदर रेगेक्स द्वारा मेल किए गए पाठ को समूह में कैप्चर करते हैं जिसे एक क्रमांकित बैकरेफर के साथ पुन: उपयोग किया जा सकता है। वे पूरे समूहबद्ध regex में regex ऑपरेटरों को लागू करने के लिए की अनुमति देते हैं।

+0

क्यों केवल 1 समूह है? यह कैसे बनाया गया और मैं एकाधिक समूह नहीं बना सकता ताकि बिना पुन: प्रयास किए मैं उन्हें सभी प्रिंट कर सकता हूं। –

+0

समूह को पेरेंटेस के बीच परिभाषित किया गया है, इसलिए आपके पैटर्न में आपके पास केवल '(\\ w +)' है, तो इसका मतलब है कि आपके पास केवल एक समूह है @ एमिटके इसे प्राप्त करें? –

+1

इसे मिला, धन्यवाद –

2

आपको समूह को पकड़कर और दिए गए पैटर्न के साथ अपनी स्ट्रिंग में मिले मैचों की संख्या से उलझन में लग रहा था।

^ak\\s*=\\s*(\\w+) 

एक कैप्चर समूह पैटर्न में कोष्ठकों का उपयोग चिह्नित है: पैटर्न आप का इस्तेमाल किया है, तो आप केवल एक कैप्चर समूह है।

while (matcher.find()) { 
    System.out.println("entire pattern: " + matcher.group(0)); 
    System.out.println("first capture group: " + matcher.group(1)); 
} 

Matcher#find() को प्रत्येक कॉल इनपुट स्ट्रिंग के खिलाफ पैटर्न लागू होगी से,:

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

+0

धन्यवाद आपके लिए बहुत अच्छा स्पष्टीकरण +1। –

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