2012-02-09 8 views
7

मैं की तरहजावा regex परिमाणकों

String string = "number0 foobar number1 foofoo number2 bar bar bar bar number3 foobar"; 

मैं एक regex की जरूरत है मेरा पीछा उत्पादन देने के लिए एक स्ट्रिंग है:

number0 foobar 
number1 foofoo 
number2 bar bar bar bar 
number3 foobar 

मैं

Pattern pattern = Pattern.compile("number\\d+(.*)(number\\d+)?"); 
Matcher matcher = pattern.matcher(string); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

की कोशिश की है, लेकिन इस

देता है
number0 foobar number1 foofoo number2 bar bar bar bar number3 foobar 
+0

क्या आपकी स्ट्रिंग में न्यूलाइन हो सकती है? –

+0

हाँ, मुझे पैटर्न जोड़ना था। डॉटल और यह काम करता है। बहुत बहुत धन्यवाद। – b3bop

उत्तर

10

तो आप अगले number (या स्ट्रिंग के अंत) तक कुछ भी इसके बाद number (+ एक पूर्णांक) चाहते हैं, है ना? सब कुछ स्ट्रिंग के अंत तक -

Pattern pattern = Pattern.compile("number\\d+(?:(?!number).)*"); 

अपने regex में, .* के रूप में ज्यादा के रूप में यह कर सकते थे मिलान नहीं हुआ:

तो फिर तुम regex इंजन है कि बताने के लिए की जरूरत है। इसके अलावा, आपने मैच का दूसरा भाग (number\\d+)? हिस्सा बनाया है। मेरी समाधान के

स्पष्टीकरण:

number # Match "number" 
\d+  # Match one of more digits 
(?:  # Match... 
(?!  # (as long as we're not right at the start of the text 
    number # "number" 
)  # ) 
.  # any character 
)*  # Repeat as needed. 
+1

यह सही है। विशेष रूप से स्पष्टीकरण के लिए धन्यवाद। – b3bop

+1

@ टिम पिट्ज़कर, उत्तर के लिए धन्यवाद! मैं हमेशा अपने विस्तृत स्पष्टीकरण पढ़ने का आनंद लेता हूं। – aviad

0

क्योंकि .* एक लालची पैटर्न है। .*?.*

Pattern pattern = Pattern.compile("number\\d+(.*?)(number\\d+)"); 
Matcher matcher = pattern.matcher(string); 
while(matcher.find();){ 
    out(matcher.group()); 
} 
+0

यह काम नहीं करेगा - यह केवल 'संख्या 0', 'संख्या 1',' संख्या 2' और 'संख्या 3' से मेल खाता है। दूसरा समूह वैकल्पिक है (और यह किसी भी तरह से मैच का हिस्सा नहीं होना चाहिए। –

+0

मैंने जवाब – shift66

+0

संपादित किया है, यह अभी भी सही सामग्री से मेल नहीं खाता है। परीक्षण स्ट्रिंग के परिणाम 'संख्या 0 foobar संख्या 1' और 'संख्या 2 बार हैं बार बार बार संख्या 3'। क्या आपने अपना कोड परीक्षण नहीं किया? (यदि स्ट्रिंग में 'संख्या' की अजीब संख्या है तो यह भी विफल हो जाता है। –

0

के बजाय का उपयोग करते हैं "foobar" सिर्फ एक उदाहरण है और वास्तव में क्या आपका मतलब है "किसी भी शब्द" निम्नलिखित पैटर्न का उपयोग करें: (number\\d+)\s+(\\w+)

+0

यह 'संख्या 2 बार बार बार बार' पर विफल रहता है। –

+0

ठीक है। एकाधिक 'बार' पर ध्यान नहीं दिया। लेकिन इसे ठीक करने में कोई समस्या नहीं है: (संख्या \\ डी +) (?: \ s + (\\ w +)) + – AlexR

-1

(.*) अपने regex का हिस्सा लालची है, इसलिए यह सब कुछ खाती है उस बिंदु से स्ट्रिंग के अंत तक। गैर लालची संस्करण में बदलें: (.*)?

http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

+0

यह काम नहीं करेगा - यह केवल ' संख्या 0', 'संख्या 1',' संख्या 2' और 'संख्या 3'। –

+0

टिम सही है। यह काम नहीं किया। – b3bop

0

आप क्यों नहीं बस number\\d+ के लिए मेल नहीं खाते, मैच स्थान क्वेरी, और स्ट्रिंग खुद के बंटवारे करते हैं?

0
Pattern pattern = Pattern.compile("\\w+\\d(\\s\\w+)\1*"); 
Matcher matcher = pattern.matcher(string); 

while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 
+0

[backreference] का अच्छा उपयोग (https://docs.oracle.com/javase/tutorial/essential /regex/groups.html)!हालांकि, यह "नंबर 4 बार फू बार" से मेल खाने का प्रयास करते समय काम नहीं करेगा, जो ओपी का लक्ष्य हो सकता है (उस स्थिति में "संख्या 4 बार" को "संख्या 4 बार फू बार" के बजाय वापस कर दिया जाता है)। –