2009-05-08 21 views
20

कहें, मेरे पास एक स्ट्रिंग है जिसे मुझे सही प्रारूप को सत्यापित करने की आवश्यकता है; जैसे RR1234566-001 (2 अक्षर, 7 अंक, डैश, 1 या अधिक अंक)।नियमित अभिव्यक्ति सी # - मिलान करते समय मिलान निकालना संभव है?

 Regex regex = new Regex(patternString); 
     if (regex.IsMatch(stringToMatch)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 

यह मुझे बताने की कि क्या stringToMatch पैटर्न patternString द्वारा परिभाषित किया गया इस प्रकार काम करता है: मैं की तरह कुछ का उपयोग करें। मुझे जो चाहिए (और मैं बाद में इसे निकालने का अंत करता हूं) हैं: 123456 और 001 - यानी stringToMatch के भाग।

कृपया ध्यान दें कि यह नियमित अभिव्यक्तियों को बनाने के तरीके के बारे में कोई प्रश्न नहीं है। मैं जो पूछ रहा हूं वह है: "क्या बाद में एक स्प्लिट फ़ंक्शन का उपयोग किए बिना मूल्यों को मिलान और निकालने का कोई तरीका है?"

+0

नोट तुम सिर्फ लौट सकते हैं कि: 'question' या से लौटने regex.IsMatch (...) // कोड' स्वीकार किए जाते हैं solution' रिटर्न से वापसी match.Success // कोड अगर/अन्य की आवश्यकता नहीं है :) –

उत्तर

54

आप इसे पूरा करने के लिए रेगेक्स समूहों का उपयोग कर सकते हैं। उदाहरण के लिए, इस regex:

var regex = new Regex(@"(\d\d\d)-(\d\d\d\d\d\d\d)"); 
var match = regex.Match("123-4567890"); 
if (match.Success) 
    .... 

यदि यह मेल खाता है, आप में पहली तीन अंक मिल जाएगा:

match.Groups[1].Value 

और

(\d\d\d)-(\d\d\d\d\d\d\d) 

के इस regex के साथ एक टेलीफोन नंबर से मेल करते हैं दूसरे 7 अंक:

match.Groups[2].Value 

पीएस सी # में, बैकस्लाश से बचने से बचने के लिए आप एक स्टाइल स्ट्रिंग का उपयोग कर सकते हैं। उदाहरण के लिए, @ "\ hi \" बराबर है "\\ hi \\"। नियमित अभिव्यक्तियों और पथों के लिए उपयोगी।

पीएस.2। पहला समूह समूह [1] में संग्रहीत है, समूह [0] जैसा कि आप उम्मीद करेंगे। ऐसा इसलिए है क्योंकि समूह [0] में पूरी मिलान वाली स्ट्रिंग शामिल है।

+9

+1 बहुत अच्छी तरह से! हालांकि, मैं एक बात जोड़ूंगा, जिस कारण से आप मैच शुरू करते हैं। समूह [1] और नहीं [0] इसलिए है क्योंकि [0] में पूरी मिलान वाली स्ट्रिंग है। –

+0

धन्यवाद @NeilWilliams, मैं सोच रहा था कि! – M3NTA7

13

इसके बजाय समूह और मिलान का उपयोग करें।

Ie:

// NOTE: pseudocode. 
Regex re = new Regex("(\\d+)-(\\d+)"); 
Match m = re.Match(stringToMatch)) 

if (m.Success) { 
    String part1 = m.Groups[1].Value; 
    String part2 = m.Groups[2].Value; 
    return true; 
} 
else { 
    return false; 
} 

तुम भी मैचों नाम कर सकते हैं, इस तरह:

Regex re = new Regex("(?<Part1>\\d+)-(?<Part2>\\d+)"); 

और इस

String part1 = m.Groups["Part1"].Value; 
    String part2 = m.Groups["Part2"].Value; 
+0

बहुत उपयोगी युक्ति! नामित समूहों के लिए – sarsnake

+0

+1 दाएं regex के लिए –

12

आप कोष्ठक का उपयोग कर सकते हैं पात्रों के समूह पर कब्जा करने की तरह उपयोग कर सकते :

string test = "RR1234566-001"; 

// capture 2 letters, then 7 digits, then a hyphen, then 1 or more digits 
string rx = @"^([A-Za-z]{2})(\d{7})(\-)(\d+)$"; 

Match m = Regex.Match(test, rx, RegexOptions.IgnoreCase); 

if (m.Success) 
{ 
    Console.WriteLine(m.Groups[1].Value); // RR 
    Console.WriteLine(m.Groups[2].Value); // 1234566 
    Console.WriteLine(m.Groups[3].Value); // - 
    Console.WriteLine(m.Groups[4].Value); // 001 
    return true; 
} 
else 
{ 
    return false; 
} 
+2

+1 ... btw अगर आप इग्नोरकेस का उपयोग करते हैं, तो आप [ए-ज़ा-जेड] के बजाय [a-z] का उपयोग कर सकते हैं। – Andomar

-1
string text = "RR1234566-001"; 
string regex = @"^([A-Z a-z]{2})(\d{7})(\-)(\d+)"; 
Match mtch = Regex.Matches(text,regex); 
if (mtch.Success) 
{ 
    Console.WriteLine(m.Groups[1].Value);  
    Console.WriteLine(m.Groups[2].Value);  
    Console.WriteLine(m.Groups[3].Value);  
    Console.WriteLine(m.Groups[4].Value);  
    return true; 
} 
else 
{ 
    return false; 
} 
संबंधित मुद्दे