框架 Regex 类
框架 Regex 类
NET 框架用 Regex 类实现正则表达式,并有三个支持类:Match、Group 和 Capture (参见 Figure A)。典型情况下,你创建 Regex 并用输入串调用 Regex::Match 来获得第一个 Match,或用 Regex::Matches 来获取所有匹配:Regex *r = new Regex("\b\w+\b"); MatchCollection* mc = r->Matches("abc ,_foo ,<& mumble7"); for (int i=0; i<mc->Count; i++) { Match *m = mc->Index(i); Console.WriteLine(m->Value); } 这将显示“abc”,“foo”和“mumble7”,每个匹配在一行。这个例子引入了一个专门的字符 \b,所谓锚或原子零宽度断言,就像 ^(开始)和$(结尾)。\b 指定某个单词的边界,所以“\b\w+\b”意思是用单词分隔的一个或多个单词字符。
Figure A Regex 类
正则表达式中的每个括弧表达式都构成一个 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 库中的 “asp">Regular Expressions as a Language”。
Regex.Match 方法
在输入字符串中搜索正则表达式的匹配项,并将精确结果作为单个Match对象返回。
重载列表
(1)在指定的输入字符串中搜索Regex构造函数中指定的正则表达式匹配项。
[C#]publicMatchMatch(string);
(2)从指定的输入字符串起始位置开始在输入字符串中搜索正则表达式匹配项。
[C#]publicMatchMatch(string,int);
(3)在指定的输入字符串中搜索pattern参数中提供的正则表达式的匹配项。
[C#]publicstaticMatchMatch(string,string);
(4)从指定的输入字符串起始位置开始在输入字符串中搜索具有指定输入字符串长度的正则表达式匹配项。
[C#]publicMatchMatch(string,int,int);
(5)在输入字符串中搜索pattern参数中提供的正则表达式的匹配项(匹配选项在options参数中提供)。
[C#]publicstaticMatchMatch(string,string,RegexOptions);
二、应用举例
1.下面的代码是为了取出网页中的Title属性
MatchTitleMatch=Regex.Match(fileContents,"<title>([^<]*)</title>",RegexOptions.IgnoreCase|RegexOptions.Multiline);
filetitle=TitleMatch.Groups[1].Value;
注意红色的1,Regex.Match方法得到的Groups的索引是从1开始的,而不是从0开始的
2.下面的代码是为了取出网页头部的"Content"属性
MatchDescriptionMatch=Regex.Match(fileContents,"<METANAME=\"DESCRIPTION\"CONTENT=\"([^<]*)\">",RegexOptions.IgnoreCase|RegexOptions.Multiline);
filedesc=DescriptionMatch.Groups[1].Value;