2011-08-10 5 views
5

誰でもRegex.Matchが非キャプチャグループをキャプチャする理由を説明できますか? MSDNでそれについて何も見つかりません。なぜRegex.Matchグループと非キャプチャグループ

Regex regexObj = new Regex("(?:a)"); 
Match matchResults = regexObj.Match("aa"); 
while (matchResults.Success) 
{ 
    foreach (Capture g in matchResults.Captures) 
    { 
     Console.WriteLine(g.Value); 
    } 
    matchResults = matchResults.NextMatch(); 
} 

は出力

a 
a 

の代わりに、空の1を生産しますか?

答えて

6

キャプチャはグループとは異なります。

matchResults.Groups[0] 

は常に一致します。したがって、あなたのグループは、

matchResults.Groups[1], 

"(a)"の場合、グループになりました。今度は"(?:a)"なので、空であることを確認できます。

キャプチャは独立したものである - 彼らはあなたがこのような何かをすることができます:

あなたが正規表現"(.)+"を持っている場合、それは文字列​​と一致します。

グループすなわち最後のグループであるため

  1. グループながら、[1]次に、 "C" であろう[1] .Captures [0] ""
  2. グループである[1]。キャプチャ[1]は "b"です。
  3. グループ[1]。キャプチャ[2]は "c"です。
+0

ありがとうございます - このような場合、MSDNは少し誤解を招くことがあります。「キャプチャグループと一致するすべてのキャプチャのコレクションを取得します」 - REGEXワールドキャプチャグループのAFAIKは、 – elevener

関連する問題