正则表达式重复组

时间:2012-11-27 09:17:37

标签: c# regex

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

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

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

4 个答案:

答案 0 :(得分:6)

CaptureCollection

您可以使用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"
}

这只是一个样本,但它应该是一个良好的开端。 我没有检查你的正则表达式的有效性