2015-02-28 5 views
13

खोज के घंटों के बाद मैंने इस सवाल से पूछने का फैसला किया। यह नियमित अभिव्यक्ति क्यों है: ^(dog).+?(cat)? काम नहीं करता है क्योंकि मुझे लगता है कि इसे काम करना चाहिए (पहले कुत्ते और बिल्ली को पकड़ें यदि कोई है)? मुझे यहां क्या समझ नहीं आ रहा है?Regex वैकल्पिक कैप्चरिंग समूह?

dog, cat 
dog, dog, cat 
dog, dog, dog 

उत्तर

17

कारण यह है कि आप के बाद एक वैकल्पिक cat नहीं मिलता है एक अनिच्छा से योग्य .+? है कि यह दोनों वैकल्पिक और गैर लंगर डाले है: इंजन है कि मैच बनाने के लिए मजबूर नहीं है, क्योंकि यह कानूनी रूप से इलाज कर सकते हैं cat.+? अनुक्रम की "पूंछ" के रूप में।

यो स्ट्रिंग के अंत में बिल्ली, यानी ^(dog).+?(cat)?$ का उपयोग लंगर हैं, तो आप एक मैच है, हालांकि मिलेगा:

Pattern p = Pattern.compile("^(dog).+?(cat)?$"); 
for (String s : new String[] {"dog, cat", "dog, dog, cat", "dog, dog, dog"}) { 
    Matcher m = p.matcher(s); 
    if (m.find()) { 
     System.out.println(m.group(1)+" "+m.group(2)); 
    } 
} 

यह प्रिंट (demo 1)

dog cat 
dog cat 
dog null 

Do बिल्ली के बाद कुछ होने पर आप इससे निपटने के लिए कैसे जानते हैं?

आप इस तरह cat को छोड़कर एक जटिल काम अभिव्यक्ति है कि कुछ भी मेल खाता है का निर्माण, द्वारा इसके साथ सौदा कर सकते हैं:

^(dog)(?:[^c]|c[^a]|ca[^t])+(cat)? 

अब cat एक लंगर (demo 2) के बिना स्ट्रिंग में कहीं भी हो सकता है।

+3

धन्यवाद। बिल्ली के बाद कुछ होने पर क्या आप जानते हैं कि इससे कैसे निपटें? उदाहरण के लिए: 'कुत्ता, कुत्ता, बिल्ली, ब्लाह'। मैं केवल पहले कुत्ते और वैकल्पिक बिल्ली को पकड़ना चाहता हूं (वहां एक बिल्ली पर हो सकता है)। – forsajt

+1

यह उत्तर देखना अच्छा लगेगा –

4

@ dasblinkenlight के जवाब महान है, लेकिन यहाँ एक regexp है कि यह के 2 हिस्सा है, जब वह/वह कहा है

आप मामले में इसके साथ सौदा करने के लिए कैसे वहाँ कुछ बिल्ली के बाद है पता करने के लिए होता है बेहतर बनाता है?

regexp ^(dog)(.+(cat))? आपको समूह संख्या को कैप्चर करने की आवश्यकता होगी। वैकल्पिक बिल्ली प्राप्त करने के लिए 2 के बजाय 3, लेकिन चार-चार-चार चालबाजी के बिना भी काम करता है।

और यहाँ the demo है (जो, फिर से, @ dasblinkenlight के डेमो जो मुझे फिर से टिंकर और इस समाधान खोजने के लिए, धन्यवाद अनुमति से अलग है!)

+0

^(कुत्ता) (?:। + (बिल्ली)) जैसे गैर-कैप्चरिंग समूह के साथ भी काम करता है? तो आपके पास वहां एक अतिरिक्त कैप्चरिंग समूह नहीं है –

2

@ figha के विस्तार से थोड़ा आगे अभी भी बढ़ाया जा सकता है, नहीं करने के लिए अनावश्यक दूसरा कब्जा।

?: का उपयोग रेगेक्स गैर-कैप्चर करने योग्य का एक ब्रैकेट हिस्सा बनाने के लिए करें। तो रेगेक्स बन जाता है: ^(dog)(?:.+(cat))?

फिर, यहां extended demo और regex test है।

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