2009-05-08 18 views
20

Say, doğru biçimde doğrulamak için gereken bir dizim var; Örneğin. RR1234566-001 (2 harf, 7 basamak, tire, 1 veya daha fazla basamak). Bu stringToMatchpatternString tarafından tanımlanan yol izler olmadığını söylemeye çalışıyorDüzenli ifadeler C# - eşleşirken eşleşmeleri çıkarmak mümkün mü?

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

: Ben böyle bir şey kullanın. Gereksinim duyduğum şey (ve sonra bunları ayıklamak): 123456 ve 001 - yani stringToMatch'un bölümleridir.

Lütfen bunun normal ifadelerin nasıl oluşturulacağıyla ilgili bir soru DEĞİLDİR. Benim sorduğum soru şudur: "Daha sonra ayrık bir işlev kullanmak zorunda kalmadan değerleri eşzamanlı olarak eşleştirmek ve çıkarmak için bir yol var mı?"

+0

Not sadece dönebilmek: 'question' veya dan Regex.IsMatch (...) // kodu döndürebilir' kabul solution' getiriler elde match.Success // kodu döndürebilir eğer/else gerekli değilse :) –

cevap

54

Bunu yapmak için normal ifadeleri kullanabilirsiniz. Örneğin, bu regex: Eşleşirse

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

, sen ilk üç basamağı bulacaksınız:

match.Groups[1].Value 

Ve

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

en bu regex ile bir telefon numarasını maç Let ikinci 7 hanede:

match.Groups[2].Value 

P.S. C# 'da, ters eğik çizgilerden kaçınmak için @ "" stil dizesini kullanabilirsiniz. Örneğin, "\ hi \" eşittir "\\ hi \\". Düzenli ifadeler ve yollar için kullanışlıdır.

P.S.2. İlk grup, beklediğiniz gibi Grup [0] 'da değil, Grup [1]' de saklanır. Çünkü Grup [0], eşleşen tüm dizeyi içerir.

+9

+1 Çok titiz! Yine de bir şey ekledim, eşleşme başlamanızın nedeni.Gruplar [1] ve [0] değil, [0] eşleşen tüm dizeyi içerdiğinden. –

+0

Teşekkür @NeilWilliams, Bunu merak ediyordum! – M3NTA7

13

Gruplama ve Eşleşmeleri kullanın.

Yani:

// 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; 
} 

Ayrıca bu gibi maçları adlandırabilirsiniz:

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

ve karakterlerin grupları yakalamak için parantezleri kullanabilirsiniz bu

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

çok kullanışlı ipucu! – sarsnake

+0

+1, adlandırılmış gruplar için –

12

gibi erişimi :

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 sağ regex için ... btw IgnoreCase kullanırsanız, [A-Za-z] yerine [a-z] kullanabilirsiniz. – 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; 
} 
İlgili konular