2009-05-08 10 views
20

私は正しい形式を検証するために必要な文字列を持っています。例えばRR1234566-001(2文字、7桁、ダッシュ、1桁以上)。これはstringToMatchpatternStringによって定義されたパターンに従っているかどうかを私に教えて働く正規表現C# - マッチしている間にマッチを抽出することは可能ですか?

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

:私のようなものを使用します。私が必要としているのは、後でこれらを抽出することです。 123456001 - つまりstringToMatchの部分です。

これは正規表現の作成方法に関する質問ではありません。私が尋ねるのは、「後に分割機能を使わなくても値を一致させて抽出する方法はありますか?」

+0

あなただけ返すことができます注: '返しregex.IsMatch(...)// question'からコードまたは '受け入れsolution' 戻ってからmatch.Success //コードを返しますin/elseは必要ありません:) –

答えて

54

これを実現するために正規表現グループを使用することができます。たとえば、この正規表現:それは一致した場合、あなたが最初の3桁があります

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

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

はのは、この正規表現と電話番号と一致してみよう

match.Groups[1].Value 

そして、 2番目の7桁は:

match.Groups[2].Value 

P. C#では、バックスラッシュのエスケープを避けるためにスタイル文字列を使用できます。たとえば、@ "\ hi \"は "\\ hi \\"と等しくなります。正規表現とパスに便利です。

P.S.2。最初のグループはGroup [1]に格納され、Group [0]には格納されません。 Group [0]には一致した文字列全体が含まれているからです。

+9

+1非常に徹底的に!私はmatch.Groups [1]ではなく[0]で始まる理由は、[0]には一致した文字列全体が含まれているためです。 –

+0

ありがとう@NeilWilliams、私はそれが不思議でした! – M3NTA7

13

代わりにグループ化と一致を使用してください。

すなわち:

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

また、このように、試合に名前を付けることができます:あなたは文字のグループをキャプチャするために括弧を使用することができ、この

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

非常に便利なチップ! – sarsnake

+0

名前付きグループの場合+1 –

12

よう

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

とのアクセスを:

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

正しい正規表現の場合は... btw IgnoreCaseを使用する場合は、[A-Za-z]の代わりに[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; 
} 
関連する問題