4

繰り返しグループをキャプチャすると、常に最後の要素が返されますが、それはあまり役に立ちません。例えば:

var regex = new RegEx("^(?<somea>a)+$");
var match = regex.Match("aaa");
match.Group["somea"]; // return "a"

最後の一致アイテムではなく、一致要素のコレクションが欲しいのですが。それは可能ですか?

4

4 に答える 4

6

CaptureCollection

単一のキャプチャ グループによって作成された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
于 2012-11-27T09:19:19.070 に答える
2

Capturesコレクションを見てみましょう:

match.Groups["somea"].Captures
于 2012-11-27T09:22:06.580 に答える
0

一致と同じ数のグループを作成するグループを数量化する場合は、グループではなく、一致させたいものに量指定子 + を使用する必要があります。

そのため、1 つのグループを作成し、一致を新しい一致に置き換え、1 つのグループを次のように作成します(a)+aaa(a+)aaa

問題をどう処理するかがわかるので、+ をキャプチャ グループ内に移動します。

于 2012-11-27T09:20:42.350 に答える
0

次のようなこともできます。

var regex = new RegEx("^(?<somea>a)+$");
var matches = regex.Matches("aaa");
foreach(Match _match in matches){
    match.Group["somea"]; // return "a"
}

これは単なるサンプルですが、良いスタートが切れるはずです。私はあなたの正規表現の妥当性をチェックしませんでした

于 2012-11-27T09:22:58.233 に答える