.net 流氓
天下无难事,有志者成之;天下无易事,有恒者得之。

前言:感谢大家对上一篇文章的支持,真的很高兴自己的文章可以对大家带来一点好处,谢谢各位.

     .今天的讲解分为以下部分:

     1.核心对象概述

     2.核心对象详解

     首先看第一部分: 1.核心对象概述

     在.NET中,正则功能是通过7个类的高度交互来提供的,但是我们只要掌握其中的3个类就可以完成绝大部分功能,所以我们来看看这3个类.

          1.1Regex对象:

           首先我们创建Regex对象:


Regex regex=new Regex(@"\s+(\d)$");

            创建对象后就可以去匹配字符文本了,此时要调用Match方法:

Code

              请大家注意返回的类型!

          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的构造函数比较简单,可以接受一个参数(作为正则表达式的字符串),前面的例子大家看过.或者接受两个参数(一个正则表达式,还有一个枚举的值).下面分别举例:

             接受一个参数的构造函数:

Code

              接受两个两个参数的构造函数:

     


//不区分大小写的匹配 并且匹配多行
Regex regex=new Regex(@"^\s+(\d)$",RegexOptions.IgnoreCase|RegexOptions.Multiline);

               大家对后面的那些枚举的值,可能不是很清楚,下面说下(只说很常用的):

               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 regex=new Regex(@"^\s+(\d)$",RegexOptions.IgnoreCase|RegexOptions.Multiline|RegexOptions.Complied);

          注意:用"|"连接,表多个.

     

          上面讲了创建Regex对象,下面接着:

          2.2使用Regex对象:             

          首先我们先创建一个Regex,便于我们下面的讲解:

Code

            我们就可以用这个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 的关系.

                例子:

          

Code

               在matchCollection中就有两个match对象,即matchCollection.Count为2,你可以迭代集合对象,用Match的Value属性来得到匹配为本:Helle  和World.

               今天就到这里,下一篇就会谈谈Regex对象稍微高级一点的问题!

作者:小洋,燕洋天

posted on 2011-08-09 19:23  .net 流氓  阅读(498)  评论(0编辑  收藏  举报