2008年(884)
分类: C/C++
2008-08-06 10:01:47
Regex *r = new Regex("\b\w \b"); MatchCollection* mc = r->Matches("abc ,_foo ,<& mumble7"); for (int i=0; i这将显示“abc”,“foo”和“mumble7”,每个匹配在一行。这个例子引入了一个专门的字符 \b,所谓锚或原子零宽度断言,就像 ^(开始)和$(结尾)。\b 指定某个单词的边界,所以“\b\w \b”意思是用单词分隔的一个或多个单词字符。Count; i ) { Match *m = mc->Index(i); Console.WriteLine(m->Value); }
正则表达式中的每个括弧表达式都构成一个 Group。Regex::Groups 返回作为集合的 Groups,它决不会是空,因为整个正则表达式本身即是一组。Groups
很重要,因为它们使你进行逻辑 OR 匹配,如“(ying|yong)”,它们使你将限定符应用到子表达式,并让你吸取匹配的单独部分。正文的
Figure 1 中我的 RegexTest 程序运行后用邮编为例显示分组。
在所有函数中最强大的函数要数 Regex::Replace,它使得正则表达式的威力惊人地强大。和许多开发人员一样,过去在多次传递字符串到多行编辑控件之前,我常常不得不手工将
“\n” 转换为“\r\n”,但使用 Regex::Replace,这个操作简直易如反掌。
s = Regex::Replace(s,"\n","\r\n");
Regex::Match 和 Replace 具备静态重载,所以你可以不用创建对象,以快速使用正则表达式。我最喜欢的 Regex::Replace
重载之一是带有一个委托参数,使你能用过程代码动态计算替换文本——参见正文中那个有趣的例子。
一些警告:每一种正则表达式的实现是有不太一样的。例如,在 Perl
中,{,1}是{0,1}的速记版,而微软的老大们不是那样做的。要当心一些微小的差别。权威的 .NET Regex 资料请参考 MSDN 库中的 “Regular
Expressions as a Language”。