我们从外往内讲起(我觉得这样更好理解些),首先Match类表示一个最终的匹配,一个正则不一定只有一个匹配,这个可以通过Match.NextMatch来尝试下面的匹配。而正则表达式中的所有组(Group)可以通过Match的Groups属性得到。组可以通过索引值得到,也可以通过名称得到。(没有名称的组排在有名称组的前面),不过注意的是所有组都是以1开始的。以0开始的那个组(Groups[0])代表着整个正则表达式(可以不整个正则表达式看成一个最大的组)。
在组内(Group类),可以通过Captures获取组的捕获信息(对应Capture类)。Group有一个Success属性代表捕获是否成功,实际上就是通过判断Captures的Count是不是等于0.
这个捕获(Capture类)代表组的具体匹配位置,Index属性可以获取匹配位置在整个字符串中的索引值,还是Value代表匹配的字符串值。Length就是匹配字符串值的长度。
最后注意Capture,Group和Match类有继承关系的,即Capture的成员Group和Match都会有,Group的成员Match也会有的。
最后看MSDN上的一个示例(引用自:http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.capture.aspx)
代码:
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string input = "Yes. This dog is very friendly.";
string pattern = @"((\w+)[\s.])+";
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine("Match: {0}", match.Value);
for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
{
Group group = match.Groups[groupCtr];
Console.WriteLine(" Group {0}: {1}", groupCtr, group.Value);
for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
Console.WriteLine(" Capture {0}: {1}", captureCtr,
group.Captures[captureCtr].Value);
}
}
}
}
输出:
Match: Yes.
Group 0: Yes.
Capture 0: Yes.
Group 1: Yes.
Capture 0: Yes.
Group 2: Yes
Capture 0: Yes
Match: This dog is very friendly.
Group 0: This dog is very friendly.
Capture 0: This dog is very friendly.
Group 1: friendly.
Capture 0: This
Capture 1: dog
Capture 2: is
Capture 3: very
Capture 4: friendly.
Group 2: friendly
Capture 0: This
Capture 1: dog
Capture 2: is
Capture 3: very
Capture 4: friendly