2009-08-03 18 views
15

साथ निकालें तार मैं इस स्ट्रिंगजावा - Regex

String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45"; 

है और मैं इन 3 सबस्ट्रिंग

06:30
07:45
निकालने के लिए की जरूरत है
अगर मैं इस regex \\ d का उपयोग {2} \: \\ d {2} मैं केवल पहले घंटे निकालने में सक्षम हूँ 06:30

Pattern depArrHours = Pattern.compile("\\d{2}\\:\\d{2}"); 
Matcher matcher = depArrHours.matcher(myString); 
String firstHour = matcher.group(0); 
String secondHour = matcher.group(1); (IndexOutOfBoundException no Group 1) 

matcher.group (1) अपवाद फेंकता है।
इसके अलावा, मैं निकालने के लिए कैसे 1234. इस स्ट्रिंग बदल सकते हैं पता नहीं है लेकिन यह हमेशा के बाद आता है 'एक्स एक्स ~'
आप कैसे regex भाव के साथ इन तार से मिलान करने पर कोई विचार है?

अद्यतन

एडम सुझाव के लिए धन्यवाद मैं अब इस regex कि मेरे स्ट्रिंग

Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})"; 

मैं संख्या का मिलान से मेल है, और matcher.group साथ 2 घंटे (1); matcher.group (2); matcher.group (3);

+0

क्या आप अपना कोड दिखा सकते हैं? यह 06:30 से मेल खाना चाहिए, सब कुछ प्रदान करने के क्रम में है। –

उत्तर

36

matcher.group() फ़ंक्शन एक पूर्णांक तर्क लेने की अपेक्षा करता है: कैप्चरिंग समूह इंडेक्स, 1 से शुरू होता है। इंडेक्स 0 विशेष है, जिसका अर्थ है "संपूर्ण मिलान"। एक कैप्चरिंग समूह कोष्ठक की एक जोड़ी "(...)" का उपयोग करके बनाया गया है। कोष्ठक के भीतर कुछ भी कैप्चर है। समूह को बाएं से दाएं (फिर से, 1 से शुरू) से क्रमांकित किया जाता है, कोष्ठक खोलकर (जिसका अर्थ है कि समूह ओवरलैप कर सकते हैं)। चूंकि आपकी नियमित अभिव्यक्ति में कोई कंस्ट्रैसिस नहीं है, इसलिए कोई समूह नहीं हो सकता है 1.

Pattern कक्षा में जावाडोक नियमित अभिव्यक्ति वाक्यविन्यास को शामिल करता है।

यदि आप ऐसे पैटर्न की तलाश में हैं जो कई बार दोबारा शुरू हो सकता है, तो आप Matcher.find() बार-बार झूठी वापसी तक उपयोग कर सकते हैं। प्रत्येक पुनरावृत्ति पर एक बार Matcher.group(0) फिर उस समय से मेल खाने वाले लौट आएगा।

यदि आप एक बड़ी नियमित अभिव्यक्ति बनाना चाहते हैं जो सब कुछ एक साथ मिलती है (जो मुझे विश्वास है कि आप क्या चाहते हैं) तो उन चीजों के तीन सेटों में से प्रत्येक के आसपास जिन्हें आप कैप्चर करना चाहते हैं, कैप्चरिंग कोष्ठक का एक सेट डालें, Matcher.match() और फिर Matcher.group(n) का उपयोग करें जहां n क्रमश: 1, 2 और 3 है। बेशक Matcher.match() भी झूठी वापसी कर सकता है, जिस स्थिति में पैटर्न मेल नहीं खाता है, और आप किसी भी समूह को पुनर्प्राप्त नहीं कर सकते हैं।

आपके उदाहरण में, आप शायद क्या करना चाहते हैं, यह कुछ पूर्ववर्ती पाठ से मेल खाता है, फिर कैप्चरिंग समूह शुरू करें, अंकों के लिए मिलान करें, कैप्चरिंग समूह को समाप्त करें, आदि ... मुझे आपके सटीक के बारे में पर्याप्त जानकारी नहीं है इनपुट प्रारूप, लेकिन यहां एक उदाहरण है।

Eat 12 carrots at 12:30 
Take 3 pills at 01:15 

और मैं मात्रा और समय निकालने के लिए चाहता था:

कहते हैं कि मैं फार्म के तार था देता है।मेरे नियमित अभिव्यक्ति कुछ ऐसा दिखाई देगा:

"\w+ (\d+) [\w ]+ (\d{1,2}:\d{2})" 

कोड कुछ ऐसा दिखाई देगा:

Pattern p = Pattern.compile("\\w+ (\\d+) [\\w ]+ (\\d{2}:\\d{2})"); 
Matcher m = p.matcher(oneline); 
if(m.matches()) { 
    System.out.println("The quantity is " + m.group(1)); 
    System.out.println("The time is " + m.group(2)); 
} 

नियमित अभिव्यक्ति "का अर्थ है एक स्ट्रिंग एक शब्द, एक जगह है, एक या अधिक संख्याएं युक्त (जो कर रहे हैं समूह 1 में कब्जा कर लिया गया), एक स्थान, शब्दों का एक सेट और अंतरिक्ष के साथ समाप्त होने वाली रिक्त स्थान, एक समय के बाद (समूह 2 में कब्जा कर लिया गया, और समय लगता है कि यह समय हमेशा 2 अंकों तक 0-गद्देदार होता है)। मैं दूंगा आप जो खोज रहे हैं उसके लिए एक करीबी उदाहरण है, लेकिन संभावित इनपुट का विवरण थोड़ा अस्पष्ट है।

+1

धन्यवाद एडम, मैं Matcher API – mickthompson

+1

हाय एडम के साथ काफी उलझन में था, मेरे इनपुट का प्रारूप हमेशा एक ही है। मुझे एक्सएक्स ~ स्ट्रिंग के बाद 2 घंटे और संख्या (उदाहरण के मामले में 1234) निकालने की आवश्यकता है। वह संख्या {3,4} अंकों का हो सकती है। – mickthompson

+4

उम्मीद है कि इससे दूसरों की मदद मिलेगी। M.group() को कॉल करने से पहले आपको ** m.matches() '(या 'm.find()') पर कॉल करने के लिए ** ** की आवश्यकता है, अन्यथा यह कहेंगे कि कोई मिलान नहीं है (क्योंकि यह नहीं था अभी तक किसी के लिए देखो), कम से कम यह एंड्रॉइड पर होता है। –