2017-03-27 6 views
8

मैं एक पैटर्न जहां इनपुट इस समूह एक या अधिक बार शामिल कर सकते हैं मेल खाने वाले समूह पर कब्जा करना चाहते हैं।Regex: एक या अधिक समूहों कैप्चर करता है, तो मौजूद है (जावा)

उदाहरण:

input = 12361 randomstuff371 12 Mar 16 138more random381 stuff73f 

मैं "12 मार्च 16" पर कब्जा करना चाहते हैं।

इस से मैं आसानी से regex का इस्तेमाल किया है:

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}).*"); 

हालांकि मेरी परेशानी यह है कि जब इनपुट इन समूहों में से एक से अधिक हो सकते हैं, मैं अनुवर्ती मिलान को पकड़ने में सक्षम नहीं हूँ।

उदाहरण:

input = randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f 

इस तरह की है कि:

group 1 = 12 Mar 16 
group 2 = 14 Jan 15 
group 3 = 13 Feb 16 

इन समूहों की संख्या से मेल करने के लिए हमेशा अलग-अलग होगा, और इसलिए मैं सोच रहा हूँ अगर वहाँ एक regex कि आदानों से अधिक काम करेगा जिसमें इनमें से 1 या अधिक समूह शामिल हैं। मैंने कोशिश की है:

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}\\s)+.*"); \\ Not sure about whitespace at the end 

हालांकि यह काम नहीं करता है। क्या यह और अधिक है कि मैं इन कब्जे वाले समूहों को कैसे संग्रहीत कर रहा हूं? मैं उन समूहों की संख्या को पूर्व निर्धारित नहीं कर सकता जिनकी मुझे आवश्यकता होगी, खासकर जब रेगेक्स को इनमें से कई इनपुट पर काम करने की आवश्यकता है।

मुझे लगता है कि मैं तारीखों के पूरे सेगमेंट को कैप्चर करने और बाद में matcher.find() के साथ इसे संभालने के लिए बेहतर हूं, जो मुझे आवश्यक समूहों की संख्या को गिनने के लिए है।

किसी भी मदद की बहुत सराहना की जाएगी।

+0

की वजह से है कि '। *' सामने और वापस। ऐसा मत करो। –

+0

@James, जवाब स्वीकार करने पर विचार कृपया अगर यह आप के लिए काम किया (देखें [कैसे इतना स्वीकार करने के लिए उत्तर] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work))। –

उत्तर

13

यह सिर्फ तुम्हारा के विशिष्ट स्वरूप से मेल खाते और Matcher#find() का उपयोग कर प्राप्त कई मैचों के रूप में सबस्ट्रिंग पाने के लिए आसान हो जाएगा:

String s = "randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f"; 
Pattern pattern = Pattern.compile("\\b\\d{2}\\s\\w+\\s\\d{2}\\b"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(0)); 
} 

online Java demo और regex demo देखें।

मैं पैटर्न के लिए शब्द सीमाओं जोड़ा यकीन है कि पैटर्न एक पूरे शब्द के रूप में मिलान किया जाता है सुनिश्चित करने के लिए है, लेकिन वे अगर अपने सबस्ट्रिंग किसी अन्य पाठ से चिपका रहे हैं हटाया जा सकता है।

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