4

捕获重复组总是返回最后一个元素,但这并不是很有帮助。例如:

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

我想要一个匹配元素的集合而不是最后一个匹配项。那可能吗?

4

4 回答 4

6

捕获集合

您可以使用CaptureCollectionwhich 表示captures由单个捕获组制作的集合。

如果 aquantifier未应用于捕获组,则CaptureCollection包含一个Capture对象,该对象表示与 Group 对象相同的捕获子字符串。

如果将 aquantifier应用于捕获组,则CaptureCollection每个捕获的子字符串都包含一个 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

如果您量化将创建与匹配项一样多的组的组,则必须将量词 + 用于要匹配的事物,而不是组。

因此(a)+aaa将创建 1 个组并将匹配替换为新出现的匹配,(a+)并将创建 1 个组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 回答