2013-07-31 15 views
17

निम्न कोड में:जावा regex - ओवरलैपिंग मैचों

public static void main(String[] args) { 
    List<String> allMatches = new ArrayList<String>(); 
    Matcher m = Pattern.compile("\\d+\\D+\\d+").matcher("2abc3abc4abc5"); 
    while (m.find()) { 
     allMatches.add(m.group()); 
    } 

    String[] res = allMatches.toArray(new String[0]); 
    System.out.println(Arrays.toString(res)); 
} 

परिणाम है:

[2abc3, 4abc5] 

मैं चाहूँगा इसे होने की

[2abc3, 3abc4, 4abc5] 

कैसे कर सकते हैं यह हासिल किया जा सकता है?

+0

आपको प्रत्येक इंडेक्स में शुरू करने की आवश्यकता होगी; खोज (int startIndex) विधि का उपयोग करें और प्रत्येक चरित्र स्थिति से शुरू होने वाली खोज करें। बेशक, तो आपको बहुत सारे मैच मिलेंगे ... मान लीजिए कि आप हर नंबर पर शुरू करना चाहते हैं, तो आप सभी मिलान करने वाले इंडेक्स के लिए Matcher.find (String.indexOf (अंक, अनुक्रमणिका)) पर एक पुनरावृत्ति संयोजन का प्रयास कर सकते हैं। – user1676075

+0

मुझे लगता है कि यह एक अंक है, तो आप मैच शुरू करने की स्थिति से बैक अप ले सकते हैं और अगले मैच के लिए वहां से ढूंढ सकते हैं। – user1676075

+1

इनपुट के लिए '" 12abc13abc14abc15 "', आप चाहते हैं '[12abc13, 2abc13, 13abc14, 3abc14, 14abc15, 4abc15]' या '[12abc13, 13abc14, 14abc15]'? – johnchen902

उत्तर

15

बाद \d+ से अपनी अगली स्कैन प्रारंभ करने मिलानकर्ता प्रयास करें।

Matcher m = Pattern.compile("\\d+\\D+(\\d+)").matcher("2abc3abc4abc5"); 
if (m.find()) { 
    do { 
     allMatches.add(m.group()); 
    } while (m.find(m.start(1))); 
} 
+0

पहले दो अप-मतदाता के लिए: सामान्य संस्करण में एक बग होता है कि यदि कुछ भी मेल नहीं खाता है, तो 'IllegalStateException' फेंक दिया जाएगा। अच्छा सुधार के लिए – johnchen902

+0

+1। – anubhava

13

सुनिश्चित नहीं हैं कि अगर यह जावा में संभव है, लेकिन PCRE में आप निम्न कार्य कर सकता है:
(?=(\d+\D+\d+)).

स्पष्टीकरण
तकनीक एक अग्रदर्शी में मेल खाने वाले समूह का उपयोग करने के लिए है, और फिर " आगे बढ़ने के लिए "एक चरित्र" खाते हैं।

  • (?=: सकारात्मक अग्रदर्शी की शुरुआत
    • (: मिलान समूह 1
      • \d+ शुरू: एक अंकों से मेल खाते हैं एक या अधिक बार
      • \D+: एक गैर अंकों चरित्र से मेल खाते हैं एक या एक से अधिक बार
      • \d+: एक अंक से अधिक अंक एक या अधिक बार
    • ): अग्रदर्शी
    • . के अंत: समूह 1
  • ) के अंत में कुछ भी मेल खाते हैं, इस "आगे बढ़ने" है। Casimir et Hippolyte लिए यह वास्तव में जावा में काम करने के लिए लगता है

Online demo


धन्यवाद। आपको बस बैकस्लैश जोड़ने और पहले कैप्चरिंग समूह को प्रदर्शित करने की आवश्यकता है: (?=(\\d+\\D+\\d+)).www.regexplanet.com पर परीक्षण किया गया:

enter image description here

+1

यह जावा में भी काम करता है। –

+2

यह गलत परिणाम देता है। – anubhava

+2

जावा में काम नहीं करता है। – JDiPierro

1

हैम्ज़ा का उपरोक्त समाधान जावा में पूरी तरह से काम करता है। आप एक पाठ में एक विशिष्ट पैटर्न पता लगाना चाहते हैं तुम सब करने की है:

String regex = "\d+\D+\d+"; 

String updatedRegex = "(?=(" + regex + "))."; 

कहाँ regex पैटर्न आप के लिए देख रहे हैं और आप ओवरलैपिंग किया जा रहा है अंत में (?=(" at the start and ")). साथ उस पर घेरा की जरूरत है।

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