2016-10-07 4 views
6

मैं आवश्यकता पर काम कर रहा है में मिलान पर कब्जा नहीं है और मैं निम्न स्ट्रिंग पर एक regex बनाने की जरूरत:Regex उम्मीद समूहों

startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z] 

इस स्ट्रिंग के कई रूपों के रूप में निम्नानुसार हो सकता है:

startDate:[*;2016-10-12T12:23:23Z] 
startDate:[2016-10-12T12:23:23Z;*] 
startDate:[*;*] 

startDate उपरोक्त अभिव्यक्ति में एक महत्वपूर्ण नाम है जो एंडडेट, अपडेटडेट आदि जैसी कुछ भी हो सकती है जिसका अर्थ है कि हम अभिव्यक्ति में हार्डकोड नहीं कर सकते हैं। कुंजी नाम किसी भी शब्द है, हालांकि [a-zA-Z_0-9]*

मैं निम्नलिखित संकलित पैटर्न

Pattern.compile("([[a-zA-Z_0-9]*):(\\[[[\\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]];[[\\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]]\\]])"); 

नमूने का मिलान उपयोग कर रहा हूँ के रूप में स्वीकार किया जा सकता है लेकिन द्वारा बनाए गए समूह मैं क्या उम्मीद नहीं कर रहे हैं।

(startDate):([*:2016-10-12T12:23:23Z]) 

group1 = "startDate" 
group2 = "[*;2016-10-12T12:23:23Z]" 

आप कृपया मुझे जावा और समूहों में सही अभिव्यक्ति के साथ मदद कर सकता है: मैं नीचे कोष्ठक से घिरा समूह चाहते हैं?

+2

'लेकिन बनाए गए समूह मेरी अपेक्षा नहीं करते हैं। '... वर्तमान समूह क्या हैं? –

+0

dateMatcher.group (0) = "s" dateMatcher.group (1) = "s" @TimBiegeleisen – Vishal

+0

'startDate: [*: *]' क्या आप इसे थोड़ा सा संकीर्ण कर सकते हैं? यदि आप वहां कुछ भी स्वीकार करेंगे तो कोलन के दोनों तरफ टाइमस्टैम्प की जांच करने का कोई मतलब नहीं है। –

उत्तर

3

आप विकल्पों को लपेटने के लिए ( के बजाय [ का उपयोग कर रहे हैं (यानी | का उपयोग कर)।

उदाहरण के लिए, निम्नलिखित कोड मेरे लिए काम करता है:

Pattern pattern = Pattern.compile("(\\w+):(\\[(\\*|\\d{4}):\\*\\])"); 
Matcher matcher = pattern.matcher(text); 
if (matcher.matches()) { 
    for (int i = 0; i < matcher.groupCount() + 1; i++) { 
     System.out.println(i + ":" + matcher.group(i)); 
    } 
} else { 
    System.out.println("no match"); 
} 

बातें मैं सिर्फ साल का उपयोग आसान बनाने के लिए, लेकिन मुझे यकीन है कि यह पूर्ण टाइमस्टैम्प स्ट्रिंग के साथ काम करेंगे हूँ।

यह अभिव्यक्ति आपको समूहों में आवश्यक से अधिक कैप्चर करती है लेकिन आप (?:) निर्माण का उपयोग करके उन्हें 'गैर-कैप्चरिंग' बना सकते हैं।

इस पर ध्यान दें कि मैंने पूर्वनिर्धारित वर्ण वर्गों का उपयोग करके अपने कुछ regexp को सरल बना दिया है। अधिक जानकारी के लिए http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html देखें।

+0

से मेल खाता है @ प्रिंटर! यह समस्या के कारण विकल्पों के चारों ओर गुम दौर के ब्रैकेट था :) – Vishal

+0

गैर कैप्चरिंग समूहों के बारे में अच्छी युक्ति। एक से मेरा वोट ;-) – Plirkee

+0

यह काम कर सकता है, लेकिन ध्यान दें कि यह वास्तव में मूल समस्या में वर्णित टाइमस्टैम्प से मेल नहीं खाता है। –

0

यहाँ एक समाधान है जो अपने मूल regex का उपयोग करता है, संशोधित है इतना है कि यह वास्तव में समूहों रिटर्न आप चाहते हैं:

String content = "startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]"; 
Pattern pattern = Pattern.compile("([a-zA-Z_0-9]*):(\\[(?:\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z|\\*):(?:\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z|\\*)\\])"); 
Matcher matcher = pattern.matcher(content); 
// remember to call find() at least once before trying to access groups 
matcher.find(); 

System.out.println("group1 = " + matcher.group(1)); 
System.out.println("group2 = " + matcher.group(2)); 

आउटपुट:

group1 = startDate 
group2 = [2016-10-12T12:23:23Z:2016-10-12T12:23:23Z] 

इस कोड इंटेलीजे पर परीक्षण किया गया और लगता है कि सही ढंग से काम कर रहा है।

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