捕获重复组总是返回最后一个元素,但这并不是很有帮助。例如:
var regex = new RegEx("^(?<somea>a)+$");
var match = regex.Match("aaa");
match.Group["somea"]; // return "a"
我想要一个匹配元素的集合而不是最后一个匹配项。那可能吗?
您可以使用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
看看Captures集合:
match.Groups["somea"].Captures
如果您量化将创建与匹配项一样多的组的组,则必须将量词 + 用于要匹配的事物,而不是组。
因此(a)+,aaa将创建 1 个组并将匹配替换为新出现的匹配,(a+)并将创建 1 个组aaa
所以你知道如何处理你的问题,只需在捕获组内移动 + 即可。
您也可以尝试这样的事情:
var regex = new RegEx("^(?<somea>a)+$");
var matches = regex.Matches("aaa");
foreach(Match _match in matches){
match.Group["somea"]; // return "a"
}
这只是一个示例,但它应该是一个好的开始。虽然我没有检查你的正则表达式的有效性