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

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

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

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

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

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

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

相应的C#语句就是:

string pattern = @"\d{2}/\d{2}/\d{4}";
string input = @"03/15/2010"
;
Regex regex
= new
Regex(pattern);
Match match
=
regex.Match(input);
for( int i = 1 ; i < match.Groups.Count ; ++
i)
Console.WriteLine(match.Groups[i].Value);

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

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

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

string 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"格式。

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

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

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

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

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

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



通过 Wiz 发布


posted on 2011-05-11 22:55  微型葡萄  阅读(6668)  评论(0编辑  收藏  举报