.NET的RegEx中的分组和匹配项有什么区别?

时间:2020-03-05 18:43:33  来源:igfitidea点击:

.NET的RegEx中的Group和Match之间有什么区别?

解决方案

回答

Match是一个对象,它指示与目标文本匹配(一部分)的特定正则表达式。如果原始正则表达式包含组标记(基本上是括号中的模式),则组表示匹配的一部分。例如,使用以下代码:

string text = "One car red car blue car";
string pat = @"(\w+)\s+(car)";
Match m = r.Match(text);

" m"将是匹配对象,它包含两个组,分别是来自((ww))的第1组,并捕获了"一个",以及包含匹配了" car"的第2组(来自"(car)")。

回答

Match是匹配正则表达式的字符串的一部分,因此一个字符串中可能存在多个匹配项。

在"比赛"中,我们可以定义匿名或者已命名的组,以便更轻松地拆分比赛。一个简单的示例是创建一个正则表达式来搜索URL,然后使用内部的组来查找协议(http),域(www.web.com),路径(/lol/cats.html)和参数以及其他内容。

// Example I made up on the spot, probably doesn't work very well
"(?<protocol>\w+)://(?<domain>[^/]+)(?<path>/[^?])"

正如我所说,可以在字符串中多次找到单个模式,因此,如果使用Regex.Matches(字符串文本),则会返回多个匹配项,每个匹配项由零个,一个或者多个组组成。

可以通过按数字索引或者使用字符串来找到那些命名的组。上面的示例可以这样使用:

Match match = pattern.Match(urls);
if (!match.Success) 
    continue;
string protocol = match.Groups["protocol"].Value;
string domain = match.Groups[1].Value;

为了使事情变得更加有趣,可以将一组匹配多次,但随后我建议开始阅读文档。

我们还可以使用组来生成反向引用,并进行部分搜索和替换,但请在MSDN上阅读更多内容。