5

一致させようとしている正規表現を含む文字列の次の例があります。

正規表現: ^\d{3}( [0-9a-fA-F]{2}){3}

一致する文字列: 010 00 00 00

私の質問はこれです-正規表現は1つのグループに一致し、キャプチャします-00文字列の最後の最後です。00ただし、最後に3つのグループすべてに一致させたいと思います。なぜこれが機能しないのですか?確かに、角かっこは、それらがすべて等しく一致していることを意味する必要がありますか?

3つのグループを別々に入力するだけでよいことはわかっていますが、これははるかに長い文字列の短い抜粋であるため、面倒です。これがよりエレガントな解決策を提供することを望んでいましたが、私の理解はやや不足しているようです!

ありがとう!

4

2 に答える 2

4

キャプチャグループに数量詞があるため、最後の反復からのキャプチャのみが表示されます。幸いなことに、.NETは(他の実装とは異なり) CaptureCollectionクラスを介してすべての反復からキャプチャを取得するためのメカニズムを提供します。リンクされたドキュメントから:

数量詞がキャプチャグループに適用される場合、CaptureCollectionにはキャプチャされたサブストリングごとに1つのCaptureオブジェクトが含まれ、Groupオブジェクトは最後にキャプチャされたサブストリングに関する情報のみを提供します。

そして、リンクされたドキュメントから提供された例:

  // Match a sentence with a pattern that has a quantifier that  
  // applies to the entire group.
  pattern = @"(\b\w+\W{1,2})+";
  match = Regex.Match(input, pattern);
  Console.WriteLine("Pattern: " + pattern);
  Console.WriteLine("Match: " + match.Value);
  Console.WriteLine("  Match.Captures: {0}", match.Captures.Count);
  for (int ctr = 0; ctr < match.Captures.Count; ctr++)
     Console.WriteLine("    {0}: '{1}'", ctr, match.Captures[ctr].Value);

  Console.WriteLine("  Match.Groups: {0}", match.Groups.Count);
  for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
  {
     Console.WriteLine("    Group {0}: '{1}'", groupCtr, match.Groups[groupCtr].Value);
     Console.WriteLine("    Group({0}).Captures: {1}", 
                       groupCtr, match.Groups[groupCtr].Captures.Count);
     for (int captureCtr = 0; captureCtr < match.Groups[groupCtr].Captures.Count; captureCtr++)
        Console.WriteLine("      Capture {0}: '{1}'", captureCtr, match.Groups[groupCtr].Captures[captureCtr].Value);
  }
于 2012-12-03T18:22:10.977 に答える
0

これは、現在の文字列で機能するはずです。これがそれらのために壊れるかどうかを確認するために、より良い例(より多くの文字列など)が必要です。単語境界(\ b)は、単語以外の文字をチェックします。

\b[0-9a-fA-F]{2}\b
于 2012-12-03T18:22:48.577 に答える