zoukankan      html  css  js  c++  java
  • 用正则表达式看.NET编程.NET核心正则类详解

                                                                     .NET核心正则类详解

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

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

         1.核心对象概述

         2.核心对象详解

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

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

              1.1Regex对象:

               首先我们创建Regex对象:

    Code

                创建对象后就可以去匹配字符文本了,此时要调用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

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

         

    Code

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

                   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 :表示你的正则表达式是否要编译,就类比我们数据库中的存储结构和一般的查询语句的关系.如果你的正则表达式只用一次,那么

    你编译就没有什么意义,如果很常用,那么编译后,以后的匹配就快些.

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

    就可以这样:

    Code

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

         

              上面讲了创建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对象稍微高级一点的问题!

         

    小洋,燕洋天
  • 相关阅读:
    安卓API首页
    安卓开发学习1
    Unity3D安卓交互
    跨天查询,少一天的问题
    COALESCE关键字的使用
    Map构造器模式 map builder pattern
    Linux服务器端使用tcpdump抓redis报文
    Java Unsigned Bytes
    JAVA与c#中byte取值范围的差异
    jack反序列化自定义字段绑定,报错:can only instantiate non-static inner class by using default, no-argument constructor
  • 原文地址:https://www.cnblogs.com/yanyangtian/p/1370005.html
Copyright © 2011-2022 走看看