一、捕获组
 
注:以下expression表示正则表达式
 
(expression)  将正则表达式匹配到的内容捕获到一个组里,组的编号在后面说明。
 
(?<name>expression)  命名捕获组。将正则表达式匹配到的内容捕获到一个组里,将组命名为name,这里的name不能包含任何标点符号,并且不能以数字开头。引用方式在后面说明。
 
(?:expression)  非捕获组。匹配正则表达式,但匹配的内容不捕获到组里,在不需要引用捕获到的内容时,用非捕获组可以节省资源,提高效率。
 
(?=expression)、(?!expression)、(?=expression)、(?!expression)  正向预搜索和反向预搜索为零宽度捕获组。匹配正则表达式,但匹配的内容不捕获到组里,它只是作为所在位置的一个附加条件而存在。
 
 
二、$用法浅谈
 
$在正则中有四种基本用法
 
第一种用法,在正则表达式中,\$用来匹配“$”字符本身
 
第二种用法,在正则表达式中,$与字符串结束的地方匹配,不匹配任何字符
 
第三种用法,在Replace方法或Result方法中,对匹配结果中捕获组内容的引用,引用的方式有两种

一种是对普通捕获组的引用,格式为“$number”
一种是对命名捕获组的引用,格式为“${name}”
具体用法及规则在后面说明。

第四种用法,用作转义,就是在上例中,如果要替换的结果中含有“$”,那么就要“$$”这样写来得到“$”字符本身
 
除以上用法外,$还有$&、$`、$'、$+、$_等几种用法,因为不常见,这里不做讨论,参考MSDN
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxfund/html/d1f52431-1c7d-4dc6-8792-6b988256892e.htm
 
 
三、捕获组的引用
 
在Replace方法或Result方法中,对匹配结果中捕获组内容的引用,上面有所提及,还有在对结果的处理中用到m.Groups,有两种方式。这里一起讨论一下。
 
对于捕获组和命名捕获组,有两种引用方式,一是$number,一是${name}
 
先说一下${name},这里的name即为前面命名捕获组的名称。如果有多个相同名称的命名捕获组,这里为匹配到内容的那个组,如果有多个同名捕获组捕获到内容,这里为最后一个命名捕获组
 
$number,这里的number为十进制数字。number并不局限于0-9,其中的“$0”指整个正则表达式匹配的内容,其它的如“$15”如果存在,则为第15个捕获组所匹配的内容,如果不存在,则为“$15”普通字符串
 
除$0有固定意义外,其它组的编号从1开始,以“(”出现的左右顺序为序,如果有捕获组和命名捕获组交替出现时,先从左至右为捕获组编号,再对命名捕获组编号
 
举例
正则表达式:<a\s+href="(?<url>[^"]*)">([^<]*)</a>
匹配字符串:<a href="http://www.baidu.com">百度</a>
匹配结果:成功
各组匹配到的内容
$0   <a href="http://www.baidu.com">百度</a>
$1   百度
${url}     http://www.baidu.com
 
虽然命名捕获组(?<url>[^"]*)在前,捕获组([^<]*)在后,但是根据编号规则,([^<]*)的编号为1,而(?<url>[^"]*)的编号为2,当然,(?<url>[^"]*)捕获的结果也可以用${url}来引用
 
为了进一步的说明编号规则,正则表达式修改如下
正则表达式:<a\s+href="((?<url>[^"]*)">([^<]*))</a>
匹配结果:成功
各组匹配到的内容
$0   <a href="http://www.baidu.com">百度</a>
$1   http://www.baidu.com">百度
$2   百度
${url}     http://www.baidu.com
 
另外,有非捕获组,或是正反向预搜索时,不参与捕获组的编号
 
应用举例1
string yourStr = @"<a href=""http://www.baidu.com"">百度</a>";
richTextBox2.Text 
= Regex.Replace(yourStr, @"<a\s+href=""(?<url>[^""]*)"">([^<]*)</a>""名称:$1\n网址:$2\n命名捕获组:${url}\n其它测试:$11");
输出:
名称:百度
网址:http://www.baidu.com
命名捕获组:http://www.baidu.com
其它测试:$11
 
应用举例2
string yourStr = @"<a href=""http://www.baidu.com"">百度</a>";
Match m 
= Regex.Match(yourStr, @"<a\s+href=""(?<url>[^""]*)"">([^<]*)</a>");
if(m.Success)
{
    richTextBox2.Text 
= m.Result("名称:$1"+ "\n";
    richTextBox2.Text 
+= m.Result("网址:$2"+ "\n";
    richTextBox2.Text 
+= m.Result("命名捕获组:${url}"+ "\n";
    richTextBox2.Text 
+= m.Result("其它测试:$11"+ "\n";
}
输出:
名称:百度
网址:http://www.baidu.com
命名捕获组:http://www.baidu.com
其它测试:$11
 
  
在对结果的处理中,m.Groups也有两种引用方式,m.Groups[number].Value,m.Groups["name"].Value,使用方式和编号方式基本同上,只有在对不存在的number捕获的引用时,才有所不同,它的结果为空。

应用举例
string yourStr = @"<a href=""http://www.baidu.com"">百度</a>";
Match m 
= Regex.Match(yourStr, @"<a\s+href=""(?<url>[^""]*)"">([^<]*)</a>");
if (m.Success)
{
    richTextBox2.Text 
= "名称:" + m.Groups[1].Value + "\n";
    richTextBox2.Text 
+= "网址:" + m.Groups[2].Value + "\n";
    richTextBox2.Text 
+= "命名捕获组:" + m.Groups["url"].Value + "\n";
    richTextBox2.Text 
+= "其它测试:" + m.Groups[11].Value + "\n";
}
输出:
名称:百度
网址:http://www.baidu.com
命名捕获组:http://www.baidu.com
其它测试:

posted on 2007-06-10 09:23  -过客-  阅读(1319)  评论(1)    收藏  举报