[C#/正则表达式]正则表达式中括号以及捕获组(又称子表达式)

本文详细介绍了在C#中如何使用正则表达式进行分组匹配,并展示了如何通过索引或组名来获取这些匹配结果,这对于进一步处理匹配到的数据非常有用。

正则表达式中我们可以使用一对括号(此处单指小括号(),中括号[]和大括号{}不包括在内)将一个正则表达式扩起来以表示它是一个整体。例如:

([0-9A-Za-z]+)

表示括号内的进行整体匹配。

但是在C#中,这种整体匹配还有一个小小的副作用:C#的正则表达式引擎将这种括号内的正则表达式组在结果中进行了保存。下面以一个例子说明。

现在我们要匹配一个时间的格式:03/15/2010。表示的是MM/DD/YYYY。相应的正则表达式是:

\d{2}/\d{2}/\d{4}

(这是个很简单的正则表达式,我就不解释了)

相应的C#语句就是:

201105112254484067.gifstring pattern = @"\d{2}/\d{2}/\d{4}" ;
201105112254486542.gif
string input = @"03/15/2010"
;
201105112254495114.gifRegex regex
= new
Regex(pattern);
2011051122544997.gifMatch match
=
regex.Match(input);
201105112254498669.gif
for( int i = 1 ; i < match.Groups.Count ; ++
i)
201105112254493968.gif Console.WriteLine(match.Groups[i].Value);

细心的读者应该注意到了我们数组的索引不是从0开始,而是从1开始。但数组的0号元素到底存放了什么呢?

你打印出来就可以看到了。0号元素默认存放了整个匹配的值:03/15/2010。

但是如果你把程序中的正则表达式的模式加上括号,变成:

201105112254492540.gifstring pattern = @"(\d{2})/(\d{2})/(\d{4})" ;

那么,除了0号元素仍然存储了"03/15/2010"之外,match.Groups实际上又多了3个元素,总共有四个元素。(你可以在跟踪调试时,watch一下这个数组的内容)。

这三个元素是什么呢?就是括号中的内容:

match.Groups[1] = "03";

match.Groups[2] = "15";

match.Groups[3] = "2010";

所以,这样就可以再取出这三个组,再进行下一步的处理。比如把"03/15/2010"的数据转化为"2010-03-15"格式。

==================================================

另外,这里还要介绍另外一个子表达式的功能,就是组名。假如我们把正则表达式改为如下的样子(具体语法请查阅正则表达式相关书籍,而且需要正则表达式引擎的支持):

201105112254491111.gifstring pattern = @"(?<DATE>(\d{2})/(\d{2})/(\d{4}))" ;

这样,整个子表达式就成了一个名为"DATE"的组。

但是在匹配成功之后,怎么能取出匹配这个组的字符串呢?很简单:

201105112254508047.gifmatch.Groups["DATE"].Value;
也就是说,可以用组名而不是索引。





转载于:https://www.cnblogs.com/microgrape/archive/2011/05/11/2043771.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值