捕获重复组总是返回最后一个元素,但这不是很有用。例如:
var regex = new RegEx("^(?<somea>a)+$");
var match = regex.Match("aaa");
match.Group["somea"]; // return "a"
我想要一个匹配元素的集合,而不是最后一个匹配项。 这可能吗?
答案 0 :(得分:6)
您可以使用CaptureCollection
代表由单个捕获组制作的captures
集。
如果quantifier
未应用于捕获组,则CaptureCollection
包含一个Capture
对象,该对象表示与Group对象相同的捕获子字符串。
如果quantifier
应用于捕获组,则CaptureCollection
为每个捕获的子字符串包含一个Capture对象,而Group
对象仅提供有关 last <的信息/ strong>捕获子字符串。
所以你可以这样做
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
答案 1 :(得分:2)
查看Captures
集合:
match.Groups["somea"].Captures
答案 2 :(得分:0)
如果量化将创建与匹配项一样多的组的组,则必须将量词+用于要匹配的事物,而不是组。
(a)+
aaa
(a+)
将创建1个组,并将匹配新匹配项aaa
将创建1个组{{1}}
所以你知道怎么处理你的问题,只需移动捕获组内的+。
答案 3 :(得分:0)
你也可以尝试这样的事情:
var regex = new RegEx("^(?<somea>a)+$");
var matches = regex.Matches("aaa");
foreach(Match _match in matches){
match.Group["somea"]; // return "a"
}
这只是一个样本,但它应该是一个良好的开端。 我没有检查你的正则表达式的有效性