C#正则学习杂谈(四)

一、捕获组
注:以下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>[^"]*)在前,捕获组([^<]*)在后,但是根据编号规则,([^<]*)的编号为1,而(?<url>[^"]*)的编号为2,当然,(?<url>[^"]*)捕获的结果也可以用${url}来引用
为了进一步的说明编号规则,正则表达式修改如下
正则表达式:<a/s+href="((?<url>[^"]*)">([^<]*))</a>
匹配结果:成功
各组匹配到的内容
$0 <a href="http://www.baidu.com">百度</a>
$2 百度
另外,有非捕获组,或是正反向预搜索时,不参与捕获组的编号
应用举例1
stringyourStr=@"<ahref=""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
stringyourStr=@"<ahref=""http://www.baidu.com"">百度</a>"; Matchm=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捕获的引用时,才有所不同,它的结果为空。
应用举例
stringyourStr=@"<ahref=""http://www.baidu.com"">百度</a>"; Matchm=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 其它测试:
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页