2013-01-24 16 views
8

में `(। *) *`, `(। *) +`, `(। +) *` ``। (। +) * `के साथ अजीब समस्या हाल के प्रश्न में बताई गई समस्या को पुन: उत्पन्न करने के लिए - Why does (.*)* make two matches and select nothing in group $1? मैंने कोशिश की * और + के विभिन्न संयोजन, ब्रैकेट के अंदर और बाहर, और परिणाम मुझे अपेक्षित नहीं था।जावा रेगेक्स

मैं आउटपुट की अपेक्षा करता था, जैसा कि उस प्रश्न में स्वीकृत उत्तर में समझाया गया था, और एक अन्य डुप्लिकेट प्रश्न में भी, Perl - Why doesn't the .* consume the entire string in this Perl regex? के तहत टैग किया गया था। लेकिन यह वही व्यवहार नहीं कर रहा है।

यह आसान करने के लिए यहां कोड मैंने कोशिश की है: -

String str = "input"; 
String[] patterns = { "(.*)*", "(.*)+", "(.+)*", "(.+)+" }; 

for (String pattern: patterns) { 
    Matcher matcher = Pattern.compile(pattern).matcher(str); 

    while (matcher.find()) { 
     System.out.print("'" + matcher.group(1) + "' : '" + matcher.start() + "'" + "\t"); 
    } 

    System.out.println(); 
} 

और यह उत्पादन मैं सभी 4 संयोजन के लिए मिल गया है: -

'' : '0' '' : '5'   // For `(.*)*` 
'' : '0' '' : '5'   // For `(.*)+` 
'input' : '0' 'null' : '5' // For `(.+)*` 
'input' : '0'     // For `(.+)+` 

अब, मैं क्या कर सकते हैं ' टी समझ में नहीं आता है, क्यों 1st और 2nd आउटपुट में, मुझे matcher.find() के लिए पूरी स्ट्रिंग first result नहीं मिल रही है। मेरा मतलब है, आदर्श रूप से, पहले मामले में, .* को पहले संपूर्ण स्ट्रिंग को कैप्चर करना चाहिए, और फिर अंत में empty string पर कब्जा करना चाहिए। अब, हालांकि यह दूसरे मैच के लिए अपेक्षित परिणाम दे रहा है, यह 1st match के लिए अच्छा व्यवहार नहीं कर रहा है।

और दूसरे मामले में, मुझे दूसरा मैच भी नहीं मिलना चाहिए, क्योंकि मेरे पास ब्रैकेट के बाहर + क्वांटिफ़ायर है।

मेरे अपेक्षित आउटपुट है: -

'input' : '0' '' : '5' // For 1st 
'input' : '0' // For 2nd 

इसके अलावा, 3rd उत्पादन, मैं क्यों null 2 के बजाय मैच empty string मिला में? पहले 3 संयोजन के लिए दूसरा मैच समान नहीं होना चाहिए?

चौथा उत्पादन अपेक्षा के अनुसार है। तो, इसमें कोई संदेह नहीं है।

+0

बस एक तरफ नोट: क्या कोई कारण है कि आप रेज़ेक्स के माध्यम से लूप को लूप का उपयोग क्यों नहीं करते हैं? आपका कोड मुझे http://www.codecrap.com –

+0

@ साइमन एंड्रेफोर्सबर्ग से कोड के बारे में याद दिला रहा है। जैसा कि मैंने कहा, मैं सिर्फ पिछले प्रश्न की समस्या का पुनरुत्पादन कर रहा था। यह एक कोड नहीं है जिसका मैं उपयोग करूंगा। तो, मैंने बस इसे जल्दी में कोड किया। मैं सुंदर दिखने के लिए इसे संशोधित कर दूंगा। –

+0

संकेत: पूरे मैच को देखने के लिए 'matcher.group (0)' का प्रयास करें, न केवल पहले कैप्चरिंग समूह। –

उत्तर

7

आप एक ही घटना है कि विचाराधीन देख आप से जुड़ा हुआ के प्रभाव को देख रहे हैं:

(.*)* के लिए:

  • पहले matcher.start()0 है, क्योंकि उसी के मैच ("input") शुरू होता है है ।
  • पहले matcher.group(1)"" क्योंकि बार-बार (.*) रिक्त स्ट्रिंग के साथ कब्जा कर लिया "input" ओवरराइट गया है (लेकिन matcher.group(0)input" शामिल करता है) है।
  • दूसरा matcher.start()5 है क्योंकि यही वह जगह है जहां रेगेक्स इंजन पहले सफल मैच के बाद है।
  • दूसरा matcher.group(1) (साथ ही matcher.group(0)) "" है क्योंकि स्ट्रिंग के अंत में मिलान करने के लिए यह सब कुछ था।

(.*)+ के लिए यह वही है। आखिरकार, खाली स्ट्रिंग को जितनी बार चाहें उतनी बार दोहराया जा सकता है और फिर भी खाली स्ट्रिंग हो सकती है।

(.+)* के लिए आपको मिल null क्योंकि, जबकि दूसरे मैच सफल होता है (लंबाई 1 मैचों रिक्त स्ट्रिंग की श्रृंखला का शून्य पुनरावृत्ति), कब्जा कोष्ठकों कुछ भी कब्जा करने के लिए नहीं कर पाए हैं, इसलिए इसकी सामग्री null कर रहे हैं (के रूप में खाली स्ट्रिंग के बजाय अपरिभाषित)।

+0

+1 विशेष रूप से तीसरे के स्पष्टीकरण को पसंद किया। :) –

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