类Match ,MatchCollection
我们通过某个条件去匹配字符串时,有时会得到几个符合条件的子字符串.
如果只想要第一次匹配到的子字符串就用函数Regex.Match().这个函数的返回类型是Match.我们通过Match.Value就可以得到子字符串的值.
如果要想得到所以符合条件的子字符串就用函数Regex.Matchs().这个函数的返回类型是MatchCollection.它是Match的一个集合类.
举个简单的例子说下吧.
string str = "csdn.net/weiwenhp/jameshp";
string pattern = @"(?<=/)\w*(?=hp); //符合此条件的子字符串有weiwen和james两个
Match ma = Regex.Match(str,pattern); //ma.Success还可以用它来判断下是否匹配成功
string result1 =ma.Value; //匹配一个结果,weiwen
MatchCollection mas = Regex.Matches(str, pattern); //获取匹配到的所有值
foreach (Match m in mas)
Console.WriteLine(m.Value);
//结果是weiwen和james
类Group,GroupCollection
我们前面有说到分组.就是用小括号()把一串字符括起来当成一个整体.并且可以给起个名字.格式是这样的(?<name>exp)
除了向后引用时方便.其他它还可以个用处,就是匹配得到一个结果Match或MatchCollection时还可以做更细致的解析.
举个例子.
string pattern = @"(?<one>[a-zA-Z]+)\d*(?<two>[a-zA-Z]+)"; //这里有两个分组,组名是one和two
string str = "###123NBA456HOT###";
Match ma = Regex.Match(str, pattern); //匹配的结果应该是ma.Value = "NBA456HOT"
string groupTwo = ma.Groups["two"].Value; //得到第二个分组匹配到的值HOT,第一个分组匹配到的值是NBA
//我们知道分组如果不显式命名会默认取名的.假如我们不取名为one,two则默认取名为1,2这样则获取第二个分组值可以用ma.Groups["2"].Value
GroupCollection groups = ma.Groups;
for(int i =0;i< groups.Count;i++)
{
Group g = groups[i];
Console.WriteLine(string.Format("index{0}:",i)+g.Value);
}
//结果是index0: NBA456HOT
index1:NBA
index2:HOT
这里我们发现Groups这个集合是从下标1开始保存匹配到的分组的值的.而下标0保存的是整个匹配到的值
在这里ma.Groups[1] 对应 ma.Groups["one"]; ma.Groups[2] 对应ma.Groups["two"]
在前面讲到分组的时候我们会碰到个奇怪的地方.就是不显式命名则默认为1,2,3..这样的名字.如果显式命名的话可以命名为one,two这样的名字.这两 点都好理解
但还可以显式的表名它没有名字(?:exp).也可以说让分组的名字为空这样做的用处在前面用分组来实现向后引用时是不容易看出来的.但现在用Group或Groups来解析时它的作用就来了
再用上面的例子来说下
string pattern = @"(?<one>[a-zA-Z]+)\d*(?:[a-zA-Z]+)"; //这里第一个分组名为one,第二个分组让它没有名字.
string str = "###123NBA456HOT###";
Match ma = Regex.Match(str, pattern); //匹配的结果还仍然是ma.Value = "NBA456HOT"
GroupCollection groups = ma.Groups;
for(int i =0;i< groups.Count;i++)
{
Group g = groups[i];
Console.WriteLine(string.Format("index{0}:",i)+g.Value);
}
//结果是index0: NBA456HOT
index1:NBA
通过上面的例子我们知道如果让分组名为空.则ma.Groups里面不会有那个分组的信息.