Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1141019
  • 博文数量: 141
  • 博客积分: 3161
  • 博客等级: 中校
  • 技术积分: 3011
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-27 14:53
文章存档

2012年(28)

2011年(113)

分类: 嵌入式

2011-09-29 10:28:08

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

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

     1.核心对象概述

     2.核心对象详解

 

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

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

     1.1Regex对象:

     首先我们创建Regex对象:     

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

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

  1. Match match=regex.Macth("May 16,2007");

    请大家注意返回的类型!

 

     1.2 Match对象

     Regex对象的Match方法通过创建并且返回 Match对象来提供匹配的信息.Match对象有很多的属性,如Success,表示匹配是否成功,是bool类型的.还有Value属性,如果匹配成功,那么那么Value就保存了实际匹配的文本的副本.

     

     Match对象返回的细节还包含捕获括号所匹配的文本..NET中用两种方法来取得匹配后的捕获文本:用Match对象的Groups[i].Value(i是一个数字),还可

以用Result方法.这些我们在后面会谈论的.

     

    1.3 Group对象

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

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

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

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

  1. //不区分大小写的匹配 并且匹配多行

  2. 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]来索引相应的值,如果你用了这个枚举,那么你的正则表达式中的括号"()"就不是捕获性的括号了.那么你的括号就只是分组了.但是注意:命名捕获括号不受影响,即(?...)还是可以捕获,你可以访问Groups["name"].Value来获得你匹配的文本.       

        RegexOptions.RightToLeft :进行从右向左的匹配,而我们的表达式一般从左向右匹配的.

        RegexOptions.Complied :表示你的正则表达式是否要编译,就类比我们数据库中的存储结构和一般的查询语句的关系.如果你的正则表达式只用一次,那么你编译就没有什么意义,如果很常用,那么编译后,以后的匹配就快些.

 

    上面的枚举值是很常用的,还有几个不怎么用,就不说了.其实我们可以在构造函数中使用多个枚举一起用,如:同时匹配多行,且不区分大小写,且编译表达式.你 就可以这样:

  1. //不区分大小写的匹配 并且匹配多行,编译

  2. Regex regex=new Regex(@"^\s+(\d)$",RegexOptions.IgnoreCase|RegexOptions.Multiline|RegexOptions.Complied);

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

     

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

         

     2.2 使用Regex对象:             

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

  1. //不区分大小写的匹配 并且匹配多行,编译

  2. Regex regex=new Regex(@"^\s+(\d)$",RegexOptions.IgnoreCase|RegexOptions.Multiline|RegexOptions.Complied);

    我们就可以用这个regex对象来匹配文本了.

    

    2.2.1 IsMatch方法:               

    这个方法用两个重载:regex.IsMatch(strString),regex.IsMatch(strString,offSet)

    IsMatch方法把目标正则表达式(^\s+(\d)$应用在目标字符串(strString),返回bool的值,表示匹配是否成功,而offSet是一个整数,表示从字符串的那个位

置开始匹配.

 

    2.2.2Match方法:      

     这个方法有3个重载,很简单的.                  

     
  1.                     regex.Match(strString),

  2.                     regex.Match(strString,offSet)

  3.                     regex.Match(strString,offSet,maxlength);

 

    其中,strString=要匹配的字符串,offSet=开始匹配的位置(int),maxlength=字符串要匹配的长度,可能字符串很长,担你只是想匹配10个字符.

     Match方法返回一个Match的对象,我们可以通过在返回的对象中获取我们匹配的信息. 

 

    注意:如果提供了maxlength参数,会进行特殊的匹配,从offSet开始的字符开始计算,正则表达式引擎会把maxlength长度的文本当作整个目标字符串,并且假设此范围之外的字符不存在,所以此时"^"只能匹配字符串中offSet位置,而"$"匹配之后的maxlength个字符的位置.,就算你的正则表达式中有环视,环视也不能"看到"此范围之外的字符.

          

    2.2.3 Matches方法:       

     

    其实Matches方法返回一组Match对象,可以类比前面说的Groups 和Group 的关系.

    例子:          

  1. Regex regex=new Regex(@"\w+");
  2. string str="hello world";
  3. MatchCollection matchCollection=regex.Matchs(str);

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

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

     

 

阅读(1243) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~