捕获重复组总是返回最后一个元素,但这并不是很有帮助。例如:
var regex = new RegEx("^(?<somea>a)+$");
var match = regex.Match("aaa");
match.Group["somea"]; // return "a"
我想要一个匹配元素的集合而不是最后一个匹配项。那可能吗?
您可以使用CaptureCollection
which 表示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"
}
这只是一个示例,但它应该是一个好的开始。虽然我没有检查你的正则表达式的有效性