2012-12-07 11 views
7

अद्यतन: सभी महान प्रतिक्रियाओं के लिए धन्यवाद! मैंने कई अलग-अलग रेगेक्स पैटर्न की कोशिश की लेकिन मुझे समझ में नहीं आया कि क्यों m.matches() ऐसा नहीं कर रहा था जो मुझे लगता है कि यह करना चाहिए। जब मैंने m.find() पर स्विच किया, साथ ही रेगेक्स पैटर्न को समायोजित करने के लिए, मैं कहीं और प्राप्त करने में सक्षम था।पैटर्न/Matcher समूह()?


मैं (पर्ल के $ & ऑपरेटर) की तरह एक जावा स्ट्रिंग में एक पैटर्न मिलान करने के लिए और उसके बाद निकालने भाग एक regex का उपयोग कर मिलान किया चाहते हैं।

यह मेरा स्रोत स्ट्रिंग है "DTSTART;TZID=America/Mexico_City:20121125T153000 मैं" अमेरिका/मेक्सिको_City "भाग निकालना चाहता हूं।

मैंने सोचा कि मैं पैटर्न और मैचर का उपयोग कर सकता हूं और फिर m.group() का उपयोग करके निकाल सकता हूं लेकिन यह मेरी अपेक्षा के अनुसार काम नहीं कर रहा है। मैंने विभिन्न रेगेक्स तारों के साथ बंदरगाह करने की कोशिश की है और एम.मैट्स() पर हिट होने वाली एकमात्र चीज़ ".*TZID.*" है जो व्यर्थ है क्योंकि यह पूरी स्ट्रिंग को वापस लौटाती है। क्या कोई मुझे प्रबुद्ध कर सकता है?

Pattern p = Pattern.compile ("TZID*:"); // <- change to "TZID=([^:]*):" 
Matcher m = p.matcher (s); 
if (m.matches()) // <- change to m.find() 
    Log.d (TAG, "looking at " + m.group()); // <- change to m.group(1) 
+0

एक आईसीएस (iCal) फ़ाइल से एक लाइन की तरह लग रहा है - आप http://ical4j.sourceforge.net/ या समकक्ष क्यों इस्तेमाल नहीं करते? वास्तव में – jrtc27

+0

। मैंने ical4j के साथ शुरुआत की लेकिन आईआईसी फाइल को पार्स करते समय यह एक त्रुटि के साथ फेंक दिया, जिससे इसे हटा दिया गया। अगर मैं डीटीएसटीएआरटी लाइनों को निकालने की तुलना में अधिक कार्यक्षमता की आवश्यकता है तो मैं इसे फिर से कोशिश कर सकता हूं। – wufoo

उत्तर

7

आप m.match() पूरी स्ट्रिंग मिलान करने के लिए कोशिश करता है का उपयोग करें, यदि आप m.find() का उपयोग करेगा, यह मैच अंदर के लिए खोज करेंगे, यह भी मैं थोड़ा अपने regexp सुधार शून्य चौड़ाई पीछे देखो का उपयोग कर TZID उपसर्ग बाहर करने के लिए:

 Pattern p = Pattern.compile("(?<=TZID=)[^:]+"); // 
    Matcher m = p.matcher ("DTSTART;TZID=America/Mexico_City:20121125T153000"); 
    if (m.find()) { 
     System.out.println(m.group()); 
    } 
2

आप तारांकन से पहले एक बिंदु खो रहे हैं। आपकी अभिव्यक्ति किसी भी संख्या के अपरकेस D एस से मेल खाती है।

Pattern p = Pattern.compile ("TZID[^:]*:"); 

तुम भी एक कब्जा समूह जब तक आप "TZID" और ":"

Pattern p = Pattern.compile ("TZID=([^:]*):"); 
अंत में

सहित सब कुछ पर कब्जा करना चाहते हैं जोड़ने चाहिए, आप स्ट्रिंग खोज करने के लिए सही एपीआई का उपयोग करना चाहिए, बल्कि पूरी तरह से स्ट्रिंग से मिलान करने का प्रयास करने से।

Pattern p = Pattern.compile("TZID=([^:]*):"); 
Matcher m = p.matcher("DTSTART;TZID=America/Mexico_City:20121125T153000"); 
if (m.find()) { 
    System.out.println(m.group(1)); 
} 

यह prints

America/Mexico_City 
2

तुम गलत पद्धति का उपयोग कर रहे हैं, इस प्रयास करें:

Pattern p = Pattern.compile(".*?TZID=([^:]+):.*"); 
Matcher m = p.matcher (s); 
if (m.matches()) 
    Log.d (TAG, "looking at " + m.group(1)); 

.*?TZID= अप करने के लिए शुरुआत में कुछ भी की पूर्ति करेंगे, तो TZID= से मेल खाते हैं और एक समूह : तक सबकुछ शुरू करेगा और मैच करेगा, समूह यहां बंद होगा और फिर : से मेल खाएगा और .* स्ट्रिंग के बाकी की भरपाई कर देंगे, अब आप क्या आप group(1)

+0

मैंने आपके लगभग समान उत्तर को आपके पक्ष में हटा दिया। आप थोड़ा बेहतर regex था। – mikeslattery

6

में यह अच्छी तरह से काम करना चाहिए की जरूरत है प्राप्त कर सकते हैं:

Pattern p = Pattern.compile("TZID=(.*?):"); 
Matcher m = p.matcher(s); 
if (m.find()) { 
    String zone = m.group(1); // group count is 1-based 
    . . . 
} 

एक वैकल्पिक regex "TZID=([^:]*)" है। मुझे यकीन नहीं है कि तेज़ कौन सा है।के रूप में

1

क्यों नहीं बस विभाजन का उपयोग करें:

String origStr = "DTSTART;TZID=America/Mexico_City:20121125T153000"; 
    String str = origStr.split(":")[0].split("=")[1]; 
+0

बहुत ही सुरुचिपूर्ण समाधान। धन्यवाद – wufoo