2014-04-11 7 views
5

सी # में नियमित अभिव्यक्ति का उपयोग करके मैं स्ट्रिंग में सभी मैचों को कैसे ढूंढ सकता हूं?सी # रेगेक्स एक स्ट्रिंग में कई शब्द मिलान करें

मैं नीचे दिए गए उदाहरण स्ट्रिंग में सभी मैचों को ढूंढना चाहता हूं। उदाहरण:

inputString: Hello (mail) byebye (time) how are you (mail) how are you (time) 

मैं उदाहरण से (mail) और (time) मिलान करना चाहते हैं। कोष्ठक सहित ( और )

इसे हल करने का प्रयास करने में, मैंने निम्नलिखित कोड को झुका दिया है।

string testString = @"(mail)|(time)"; 

Regex regx = new Regex(Regex.Escape(testString), RegexOptions.IgnoreCase); 
List<string> mactches = regx.Matches(inputString).OfType<Match>().Select(m => m.Value).Distinct().ToList(); 

foreach (string match in mactches) 
{ 
    //Do something 
} 

पाइप (|) तार्किक OR हालत के लिए इस्तेमाल किया है?

उत्तर

6

का उपयोग Regex.Escape(testString) अपने पाइप चरित्र से बचने के लिए जा रहा है, प्रभावी रूप में

@"\(mail\)\|\(time\)". 

इस प्रकार, आपके regex शाब्दिक "(mail)|(time)" की तलाश में है

@"(mail)|(time)" 

मोड़।

अपने मैचों में से सभी कोष्ठक से घिरा हुआ शब्द के रूप में सरल कर रहे हैं, मैं इस तरह regex का निर्माण होगा:

List<string> words = new List<string> { "(mail)", "(time)", ... }; 
string  pattern = string.Join("|", words.Select(w => Regex.Escape(w))); 
Regex  regex = new Regex(pattern, RegexOptions.IgnoreCase); 
+0

परफेक्ट !!!! @ फिशबस्केट गॉर्डो – Nisho

3
अपने परीक्षण स्ट्रिंग में कोष्ठकों भागने

:

string testString = @"\(mail\)|\(time\)"; 

निकालें Regex.Escape :

Regex regx = new Regex(testString, RegexOptions.IgnoreCase); 

आउटपुट (पारे शामिल हैं ntheses):

(mail) 
(time) 

कारण Regex.Escape अपने मामले में काम नहीं कर रहा है कि यह | केरेक्टर का बचना भी है:

अक्षरों से परे का एक न्यूनतम सेट पलायन (\, *, +, ?, |, {, [, (,), ^, $,।, #, और व्हाइटस्पेस) उन्हें अपने \ कोड के साथ बदलकर।

+0

वाह ... सही। लेकिन एस्केप का उपयोग क्यों किया जाता है? क्योंकि मैं उदाहरण के लिए शब्दों की एक सूची का उपयोग करके डायनामिक testString निर्माण करना चाहते हैं: (मेल) (समय) (यह) मैंने सोचा था कि (जो) मैं उन्हें Regex.Escape उपयोग कर से बचने के सकता है। अजीब! @ ग्रेंट विनी – Nisho

+1

मुझे लगता है क्योंकि यह आपके '|' चरित्र से भी बच निकलता है। –

+1

@ निशो, सभी प्रकार से 'एस्केप' का उपयोग करें, 'स्ट्रिंग.जॉइन ("|", myListOfWords.Select (Regex.Escape)) जैसे कुछ। – decPL

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