.NETは、RegularExpression実装でCaptureコレクションを提供しているため、特定の繰り返しグループの最後のインスタンスだけでなく、そのすべてのインスタンスを取得できます。それは素晴らしいことですが、サブグループを含む繰り返しグループがあり、グループの下で関連しているサブグループを取得しようとしていますが、方法が見つかりません。助言がありますか?
私は他の多くの質問を見てきました、例えば:
しかし、私は肯定的(「うん、これが方法だ」)または否定的(「いいえ、できません。」)のどちらにも当てはまる答えを見つけられませんでした。
不自然な例として、入力文字列があるとします。
abc d x 1 2 x 3 x 5 6 e fgh
ここで、「abc」と「fgh」は大きなドキュメントで無視したいテキストを表し、「d」と「e」は関心のある領域をラップし、その関心のある領域内で「xn[n]」は任意の何度か。私が興味を持っているのは、「x」領域の数字のペアです。
したがって、この正規表現パターンを使用して解析しています。
.*d (?<x>x ((?<fir>\d+) )?((?<sec>\d+) )?)*?e.*
これは、ドキュメント内で1つだけ一致するものを検索しますが、「x」グループを何度もキャプチャします。この例で抽出したい3つのペアは次のとおりです。
- 1、2
- 3
- 5、6
しかし、どうすればそれらを入手できますか?私は次のことを行うことができます(C#で):
using System;
using System.Text;
using System.Text.RegularExpressions;
string input = "abc d x 1 2 x 3 x 5 6 e fgh";
string pattern = @".*d (?<x>x ((?<fir>\d+) )?((?<sec>\d+) )?)*?e.*";
foreach (var x in Regex.Match(input, pattern).Groups["x"].Captures) {
MessageBox.Show(x.ToString());
}
グループ「x」を参照しているので、次の文字列を取得します。
- x 1 2
- x 3
- x 5 6
しかし、それは私に数字自体を理解させません。したがって、「x」だけでなく、「fir」と「sec」を個別に実行できます。
using System;
using System.Text;
using System.Text.RegularExpressions;
string input = "abc d x 1 2 x 3 x 5 6 e fgh";
string pattern = @".*d (?<x>x ((?<fir>\d+) )?((?<sec>\d+) )?)*?e.*";
Match m = Regex.Match(input, pattern);
foreach (var f in m.Groups["fir"].Captures) {
MessageBox.Show(f.ToString());
}
foreach (var s in m.Groups["sec"].Captures) {
MessageBox.Show(s.ToString());
}
取得するため:
- 1
- 3
- 5
- 2
- 6
しかし、「4」が欠落しているのは2番目のペアであり、他のペアの1つではないことを知る方法はありません。
じゃあ何をすればいいの?これをC#で、または「x」グループでの2回目の正規表現テストで簡単に解析できることはわかっていますが、最初の正規表現の実行ですべての作業が完了し、結果がわかっているので、方法があるはずです。 Matchオブジェクトを操作して、必要なものを取得します。
また、これは不自然な例であることを忘れないでください。実際のケースはやや複雑なので、余分なC#コードをスローするだけでも面倒です。しかし、既存の.NETオブジェクトでそれができない場合は、それを知る必要があります。続行します。
考え?