繰り返しグループをキャプチャすると、常に最後の要素が返されますが、それはあまり役に立ちません。例えば:
var regex = new RegEx("^(?<somea>a)+$");
var match = regex.Match("aaa");
match.Group["somea"]; // return "a"
最後の一致アイテムではなく、一致要素のコレクションが欲しいのですが。それは可能ですか?
単一のキャプチャ グループによって作成されたCaptureCollection
のセットを表す which を使用できます。captures
quantifier
がキャプチャ グループに適用されない場合、には、Group オブジェクトと同じキャプチャされた部分文字列を表すCaptureCollection
単一のオブジェクトが含まれます。Capture
quantifier
がキャプチャ グループに適用される場合、にはCaptureCollection
キャプチャされた部分文字列ごとに 1 つの Capture オブジェクトが含まれ、オブジェクトは最後Group
にキャプチャされた部分文字列に関する情報のみを提供します。
だからあなたはこれを行うことができます
var regex = new Regex("^(?<somea>a)+$");
var match = regex.Match("aaa");
List<string> aCaptures=match.Groups["somea"]
.Captures.Cast<Capture>()
.Select(x=>x.Value)
.ToList<string>();
//aCaptures would now contain a list of a
Captures
コレクションを見てみましょう:
match.Groups["somea"].Captures
一致と同じ数のグループを作成するグループを数量化する場合は、グループではなく、一致させたいものに量指定子 + を使用する必要があります。
そのため、1 つのグループを作成し、一致を新しい一致に置き換え、1 つのグループを次のように作成します(a)+
。aaa
(a+)
aaa
問題をどう処理するかがわかるので、+ をキャプチャ グループ内に移動します。
次のようなこともできます。
var regex = new RegEx("^(?<somea>a)+$");
var matches = regex.Matches("aaa");
foreach(Match _match in matches){
match.Group["somea"]; // return "a"
}
これは単なるサンプルですが、良いスタートが切れるはずです。私はあなたの正規表現の妥当性をチェックしませんでした