2011-08-10 14 views
5

क्या कोई यह समझा सकता है कि Regex.Match गैर-कैप्चरिंग समूहों को कैप्चर क्यों करता है। एमएसडीएन में इसके बारे में कुछ भी नहीं मिला। क्योंRegex.Match और noncapturing समूह

Regex regexObj = new Regex("(?:a)"); 
Match matchResults = regexObj.Match("aa"); 
while (matchResults.Success) 
{ 
    foreach (Capture g in matchResults.Captures) 
    { 
     Console.WriteLine(g.Value); 
    } 
    matchResults = matchResults.NextMatch(); 
} 

उत्पादन का उत्पादन

a 
a 

बजाय खाली एक की?

उत्तर

6

कैप्चर समूह से अलग है।

matchResults.Groups[0] 

हमेशा पूरा मिलान होता है। तो अपने समूह

matchResults.Groups[1], 

हो गया होता अगर regex "(a)" थे। अब चूंकि यह "(?:a)" है, तो आप यह देख सकते हैं कि यह खाली है।

कैप्चर एक अलग बात हैं - वे आप इस तरह कुछ करने के लिए अनुमति देते हैं: तो यह स्ट्रिंग "abc" से मेल खाएंगे, आप regex "(.)+" है, तो

समूह [1] तो,, "सी" होगा क्योंकि है कि पिछले समूह है, जबकि

  1. समूह [1] .Captures [0] है "एक"
  2. समूह [1]। कैप्चर [1] "बी"
  3. समूह [1]। कैप्चर [2] "सी" है।
+0

धन्यवाद - इस तरह के मामले में एमएसडीएन थोड़ा भ्रामक है "कैप्चरिंग समूह द्वारा मिलान किए गए सभी कैप्चरों का संग्रह प्राप्त करता है" - रेगेक्स विश्व कैप्चरिंग समूह में AFAIK को बिल्कुल (ए) निर्माण कहा जाता है – elevener

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