[解決済み] .NET正規表現における「グループ」と「キャプチャ」の違いとは?
質問
.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はグループ内でしか意味を持ちません。 .
関連
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] JavaScriptの正規表現でマッチしたグループにアクセスするにはどうすればよいですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] SelectとSelectManyの違い
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2年前のMSDateを把握する【クローズド