用正则表达式看.NET编程--.NET核心正则类详解
.NET核心正则类详解
前言:感谢大家对上一篇文章的支持,真的很高兴自己的文章可以对大家带来一点好处,谢谢各位.
.今天的讲解分为以下部分:
1.核心对象概述
2.核心对象详解
首先看第一部分: 1.核心对象概述
在.NET中,正则功能是通过7个类的高度交互来提供的,但是我们只要掌握其中的3个类就可以完成绝大部分功能,所以我们来看看这3个类.
1.1Regex对象:
首先我们创建Regex对象:
创建对象后就可以去匹配字符文本了,此时要调用Match方法:
请大家注意返回的类型!
1.2Match对象
Regex对象的Match方法通过创建并且返回 Match对象来提供匹配的信息.Match对象有很多的属性,如Success,表示匹配是否成功,是bool类型的.还有Value属性,如果匹配成功,那么那么Value就保存了实际匹配的文本的副本.
Match对象返回的细节还包含捕获括号所匹配的文本..NET中用两种方法来取得匹配后的捕获文本:用Match对象的Groups[i].Value(i是一个数字),还可
以用Result方法.这些我们在后面会谈论的.
1.3Group对象
我们前面谈了一些关于Groups的知识,大家可以猜到,其实Groups就是Group对象的集合,所以Groups[1].Value就是第一个捕获括号匹配的文本值.每一
组捕获括号都有一个对应的Group对象.另外还有一个"虚拟分组",其编号为0,它是保存全局的匹配信息的.比如上面的例子中,Groups[0].Value的值就是"May
16,2007",而Groups[1].Value的值就是"16".
注意:下面例子的match在上面例子中定义了的:
因此,match.Value和match.Groups[0].Value是等价的--都是全局匹配的文本的副本.第一种方法很简洁,但是我们要记住有0这个分组因为match.Groups.Count包含了0分组的情况,所以上面的那个例子中match.Groups.Count为2.
注意:匹配时会计算出所有结果:吧正则表达式应用到字符文本中,得到一个Match对象,此时所有的结果,如匹配的位置,每一个捕获分组匹配的内容等,都会计算
出来,封装到一个Match对象中.我们可以访问那个Match对象的属性和方法来获取我们的结果.
2.核心对象详解
看完上面的部分,大家对一些常用的对象基本有了了解,其实杂实践中,我们很少明确的声明Regex 对象,也就是说,我们一般不new一个Regex对象.因为Regex类有很多的静态方法.
2.1创建Regex对象.
创建一个 Regex对象不难,因为Regex的构造函数比较简单,可以接受一个参数(作为正则表达式的字符串),前面的例子大家看过.或者接受两个参数(一个正则表达式,还有一个枚举的值).下面分别举例:
接受一个参数的构造函数:
接受两个两个参数的构造函数:
大家对后面的那些枚举的值,可能不是很清楚,下面说下(只说很常用的):
RegexOptions的取值的意义:
RegexOptions.IgnoreCase:表示不区分大小写的匹配;
RegexOptions.Multiline:表示正则表达式在匹配的时候采用增强的锚点模式,也就是说,可以匹配字符串内部的换行符,不仅仅知识匹配整个字符串的开始和结尾:举例如下:
一个字符串,string str="This is a apple.(换行)
Hello xiaoyang.(换行)
Hello everyone!"
(注:大家甚至可以把一篇文章读入到一个字符串中,文章肯定有很多的行)
如果我们想匹配str中所有的a,那么你用表达式Regex regex=new Regex(@"^a$");,那么你就只能匹配其中的一行,即你得到匹配是a apple,后面的两行
没有匹配,所以你就可以用 RegexOptions.Multiline匹配多行.
RegexOptions.Singleline:表示只匹配一行.
RegexOptions.ExplicitCapture:在正则表达式中,一般括号"()"是捕获性的括号,即你可以在结果中有Groups[i]来索引相应的值,如果你用了这个枚举,那
么你的正则表达式中的括号"()"就不是捕获性的括号了.那么你的括号就只是分组了.但是注意:命名捕获括号不受影响,即(?<name>...)还是可以捕获,你可以访问
Groups["name"].Value来获得你匹配的文本.
RegexOptions.RightToLeft :进行从右向左的匹配,而我们的表达式一般从左向右匹配的.
RegexOptions.Complied :表示你的正则表达式是否要编译,就类比我们数据库中的存储结构和一般的查询语句的关系.如果你的正则表达式只用一次,那么
你编译就没有什么意义,如果很常用,那么编译后,以后的匹配就快些.
上面的枚举值是很常用的,还有几个不怎么用,就不说了.其实我们可以在构造函数中使用多个枚举一起用,如:同时匹配多行,且不区分大小写,且编译表达式.你
就可以这样:
注意:用"|"连接,表多个.
上面讲了创建Regex对象,下面接着:
2.2使用Regex对象:
首先我们先创建一个Regex,便于我们下面的讲解:
我们就可以用这个regex对象来匹配文本了.
2.2.1IsMatch方法:
这个方法用两个重载:regex.IsMatch(strString),regex.IsMatch(strString,offSet)
IsMatch方法把目标正则表达式(^\s+(\d)$应用在目标字符串(strString),返回bool的值,表示匹配是否成功,而offSet是一个整数,表示从字符串的那个位
置开始匹配.
2.2.2Match方法:
这个方法有3个重载,很简单的.
regex.Match(strString),
regex.Match(strString,offSet)
regex.Match(strString,offSet,maxlength);
其中,strString=要匹配的字符串,offSet=开始匹配的位置(int),maxlength=字符串要匹配的长度,可能字符串很长,担你只是想匹配10个字符.
Match方法返回一个Match的对象,我们可以通过在返回的对象中获取我们匹配的信息.
注意:如果提供了maxlength参数,会进行特殊的匹配,从offSet开始的字符开始计算,正则表达式引擎会把maxlength长度的文本当作整个目标字符串,并且
假设此范围之外的字符不存在,所以此时"^"只能匹配字符串中offSet位置,而"$"匹配之后的maxlength个字符的位置.,就算你的正则表达式中有环视,环视也不能"看
到"此范围之外的字符.
2.2.3Matches方法:
其实Matches方法返回一组Match对象,可以类比前面说的Groups 和Group 的关系.
例子:
在matchCollection中就有两个match对象,即matchCollection.Count为2,你可以迭代集合对象,用Match的Value属性来得到匹配为本:Helle 和World.
今天就到这里,下一篇就会谈谈Regex对象稍微高级一点的问题!