1. ホーム
  2. c#

[解決済み] .NET正規表現における「グループ」と「キャプチャ」の違いとは?

2022-05-04 17:10:28

質問

.NETの正規表現言語において、quot;group"とquot;capture"の違いについて少し曖昧です。 次のようなC#のコードを考えてみましょう。

MatchCollection matches = Regex.Matches("{Q}", @"^\{([A-Z])\}$");

この結果、文字'Q'のキャプチャが1つ生成されると思いますが、生成されたキャプチャのプロパティを表示すると、以下のようになります。 MatchCollection というのが見えます。

matches.Count: 1
matches[0].Value: {Q}
        matches[0].Captures.Count: 1
                matches[0].Captures[0].Value: {Q}
        matches[0].Groups.Count: 2
                matches[0].Groups[0].Value: {Q}
                matches[0].Groups[0].Captures.Count: 1
                        matches[0].Groups[0].Captures[0].Value: {Q}
                matches[0].Groups[1].Value: Q
                matches[0].Groups[1].Captures.Count: 1
                        matches[0].Groups[1].Captures[0].Value: Q

具体的にはどうなっているのでしょうか? 試合全体のキャプチャーもあるようですが、グループはどのように入っているのでしょうか? また、なぜ matches[0].Captures には、文字'Q'のキャプチャが含まれていますか?

どのように解決するのですか?

モヤモヤしているのはあなたが初めてではないでしょう。ここで、有名な ジェフリー・フリードル は、それについて述べています(437ページ以上)。

<ブロッククオート

この作品は 新しい次元の面白さ を使用することができます。 を膨らませる。

さらにその先も。

グループ オブジェクトとキャプチャオブジェクトは 各グループオブジェクトには を表すキャプチャーのコレクションです。 すべての 中間体 が一致した場合 と同じように、マッチ中にグループ グループによってマッチした最後のテキスト。

そして数ページ後、これが彼の結論である。

.NETを乗り越えた後 のドキュメントを読んで、実際に これらのオブジェクトが何を追加するかを理解すること。 私は複雑な心境です。一方 一方では、興味深い その一方で、これは 効率的な負担が増えるような気がします。 使われることのない機能の 大半の場合

つまり、「よく似ているけれど、たまに、たまたま、使い道が見つかる」ということです。白髭が生える前に、キャプチャーが好きになるかもしれませんよ。


上記や他の記事で語られていることは、あなたの質問に対する答えにはなっていないようなので、次のように考えてみてください。Capturesは、一種の履歴追跡装置だと考えてください。正規表現がマッチすると、文字列を左から右へ走査し(バックトラックはしばらく無視します)、マッチするキャプチャ括弧に出会うと、その括弧を $x (xは任意の数字)例えば、次のようにする。 $1 .

通常の正規表現エンジンは、キャプチャした括弧が繰り返される場合、現在の $1 で、新しい値に置き換えます。.NETはそうではなく、この履歴を保持し、それを Captures[0] .

正規表現を次のように変更すると、次のようになります。

MatchCollection matches = Regex.Matches("{Q}{R}{S}", @"(\{[A-Z]\})+");

を見ると、最初の Group には、1つの Captures (に等しい(最初のグループは常にマッチ全体である。 $0 を保持し、2番目のグループには {S} つまり、最後にマッチしたグループのみです。しかし、ここが問題なのですが、他の2つのキャッチを見つけたい場合、それらは Captures のすべての中間キャプチャが含まれています。 {Q} {R}{S} .

もしあなたが、最後のマッチしか表示されないマルチプルキャプチャから、文字列の中に明らかに存在する個々のキャプチャを表示するにはどうしたらよいかと考えたなら、次のようにしなければなりません。 Captures .

最後の質問ですが、マッチの合計には必ずキャプチャーの合計が1つあります。Captureはグループ内でしか意味を持ちません。 .