सी # में, कई अन्य प्रोग्रामिंग भाषा के रूप में, regex इंजन कब्जा समूहों, कि submatches हैं का समर्थन करता है, के कुछ हिस्सों सबस्ट्रिंग जो पूरे रेगेक्स पैटर्न से मेल खाते हैं, कोष्ठक की सहायता से रेगेक्स पैटर्न में परिभाषित किया गया है (उदाहरण के लिए 1([0-9])3
से मेल खाता है 10 और 2
के मान को कैप्चर समूह 1 बफर में सहेजें)। कैप्चर किए गए ग्रंथों को Match.Groups[n].Value
के माध्यम से एक्सेस किया जाता है जहां n पैटर्न के अंदर कैप्चर समूह की अनुक्रमणिका है।
कैप्चरिंग अधिक प्रभावशाली है जो को देखता है। जब भी जटिल परिस्थितियों की आवश्यकता नहीं होती है, तो कैप्चरिंग समूह बहुत बेहतर विकल्प होते हैं।
रेगेक्सहेरो में किए गए मेरे रेगेक्स स्पीड टेस्ट को देखें।शुद्ध:
अब, हम कैसे घुंघराले ब्रेसिज़ अंदर-स्ट्रिंग मिल सकता है?
- अगर वहाँ एक नकार चरित्र वर्ग है कोई अन्य घुंघराले ब्रेसिज़ के अंदर साथ,:
{([^{}]*)
- अगर वहाँ नेस्ट किया जा सकता है कर्ली कोष्ठक:
{((?>[^{}]+|{(?<c>)|}(?<-c>))*(?(c)(?!)))
दोनों ही मामलों में, हम एक उद्घाटन मैच {
, और उसके बाद {
या }
के अलावा किसी भी चरित्र से मिलान करें, या (2) पहले वर्णित }
तक के किसी भी वर्ण। , Token1, Token {2}
Token1, Token 2
:
यहाँ sample code है:
var matches = Regex.Matches("Test {Token1} {Token 2}", @"{([^{}]*)");
var results = matches.Cast<Match>().Select(m => m.Groups[1].Value).Distinct().ToList();
Console.WriteLine(String.Join(", ", results));
matches = Regex.Matches("Test {Token1} {Token {2}}", @"{((?>[^{}]+|{(?<c>)|}(?<-c>))*(?(c)(?!)))");
results = matches.Cast<Match>().Select(m => m.Groups[1].Value).Distinct().ToList();
Console.WriteLine(String.Join(", ", results));
परिणाम।
ध्यान दें कि RegexOptions.IgnoreCase
अनावश्यक है जब आपके पास कोई शाब्दिक अक्षर नहीं है जिसमें पैटर्न में अलग-अलग मामले हो सकते हैं।
स्रोत
2015-11-26 10:52:10
हां, तो पूर्ण '(? <= \ {) [^}] * (? = \ }) 'रेगेक्स अच्छी तरह से काम करता प्रतीत होता है। धन्यवाद। – PeterX