2011-09-08 9 views
5

मैं आम तौर पर एक रेगेक्स को पार्स करने के लिए कई स्थितियों और/या लूपों के साथ समाप्त होता हूं और अपने कैप्चर समूहों में वापस मूल्यों को इंटरपोलेट करता हूं, और आशा करता हूं कि इस समस्या को एक सरल तरीके से हल करने के लिए अनुभवी उत्तरों की तलाश है।एक रेगेक्स पैटर्न में मानों को इंटरपोल करके स्ट्रिंग बनाने का सबसे आसान तरीका?

उदाहरण के लिए, X(?<xid>\d+)-(?<xsub>\w+)\.xml की तरह एक regex पैटर्न नामित कैप्चर समूहों "XID" और "xsub", जैसे फ़ाइल नाम से मेल करने का इरादा होने दिया: X1-foo.xml, X555-bar.xml, आदि, जब तर्क के साथ प्रदान की: int xid=999, string xsub="baz", मैं उचित फ़ाइल नाम के निर्माण के लिए पैटर्न समूहों में उन मूल्यों को जोड़ हैं: x 999-baz.xml

इसे सरल रखने के लिए, स्पष्ट कैप्चर नहीं लगाए गए हैं।


String.Format बिना :

इस अवधारणा को आसानी से नेट स्ट्रिंग प्रारूप वस्तुओं के साथ पूरा किया है की तरह String.Format("X{0}-{1}.xml", xid, xsub) लेकिन मैं पहले से ही किसी भी फ़ाइल नाम स्ट्रिंग से उन मूल्यों को पार्स आउट कर एक Regex पैटर्न है, और चाहते हैं सटीकता के लिए, इसके साथ एक फ़ाइल नाम पुनर्निर्माण करके विपरीत दिशा में जाने के लिए एक ही पैटर्न का उपयोग करने के लिए। यदि मुझे स्ट्रिंग से मानों को पार्स करने के लिए रेगेक्स पैटर्न की आवश्यकता है, लेकिन फ़ाइल नाम को पुनर्निर्मित करने के लिए प्रारूप आइटमों के साथ एक स्ट्रिंग, इसे दो प्रकार के विशिष्ट वाक्यविन्यासों का उपयोग करने की आवश्यकता होती है, जिससे उन्हें लिखते समय मैन्युअल त्रुटि का अधिक मौका मिलता है - यह बहुत आसान है गलती से एक खराब प्रारूप आइटम स्ट्रिंग बनाएं जो कि रेगेक्स पैटर्न मिलान के परिणाम को ठीक से पुनर्निर्माण नहीं करता है, या इसके विपरीत।

उत्तर

0

मैंने यह गलत पढ़ा होगा लेकिन ऐसा लगता है कि आपको Regex की आवश्यकता है। System.ext.RegularExpressions नामस्थान में विधि बदलें।

string pattern = "Your pattern"; 
string replacement = "Your text to replace"; 
Regex rgx = new Regex(pattern); 
string result = rgx.Replace(input, replacement); 

रेगेक्स लाइब्रेरी में अन्य विधियां हैं जो एक स्ट्रिंग में एकाधिक प्रतिस्थापन को बेहतर ढंग से समायोजित कर सकती हैं।

+2

इस स्थिति में, रेगेक्स वास्तव में 'इनपुट' है। – BoltClock

2

आप regex का उपयोग कर सकते हैं (Yay, मेटा-regexes!):

public static string RegexInterp(Regex pattern, Dictionary<string, string> pairs) { 
    string regex = pattern.ToString(); 
    string search; 

    foreach(KeyValuePair<string, string> entry in pairs) 
    { 
     // using negative lookbehind so it doesn't match escaped parens 
     search = @"\(\?<" + entry.Key + @">.*?(?<!\\)\)"; 
     regex = Regex.Replace(regex, search, entry.Value); 
    } 

    return Regex.Unescape(unescaped); 
} 

और फिर:

Regex rx = new Regex(@"X(?<xid>\d\d+)-(?<xsub>\w+)\.xml"); 

var values = new Dictionary <string, string>() {{"xid", "999"}, 
               {"xsub", "baz"}} ; 

Console.WriteLine(RegexInterp(rx, values));  

प्रिंटों

X999-baz.xml 

डेमो: http://ideone.com/QwI2W

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