用正则表达式看.NET编程--正则核心对象详解(三 )

                                                                      正则核心对象详解(三 )

 

     前言:很感谢大家对正则表达式文章的支持,这篇文章是这个系列的最后一节了,,但是正如之前所说的,这里将的仅仅只是怎么用.NET的正则表达式类,但是,

 

对正则表达式的引擎的内部机制没有提及,如果大家需要,我会继续写下有关内部机制的问题.

 

     今天的内容如下:

     1. Match对象的使用

     2. Group对象的使用

     3.便捷方法

     4. 正则表达式的缓存

        

     今天的内容比较好懂.

     1. Match类的使用

     一般有三种方法可以创建Match对象:第一:Regex的Match方法,第二,静态函数Regex.Match方法,第三,Match对象自己的NextMatch方法.Match对象封装了某

个正则表达式对象的单次应用的所有的相关信息.

     下面介绍相关的属性和方法:
          假设:myMatch对象是我们已经创建好的一个Match对象.

          myMatch.Success属性,返回一个bool的值,表示一个匹配是否成功.

          myMatch.Value属性和myMatch.ToString方法,返回实际匹配的文本,注意:Match是单次匹配

          myMatch.Length属性,匹配文本的长度

          myMatch.Index属性,返回是一个整数,显示匹配文本再目标中的其实位置,匹配是从字符串的左边向右匹配的,编号从0开始.

          注意:这个数字表示从目标字符串的最左边到匹配文本的左边的长度,如匹配"abc",而我们的串是" asdffabc",把么Index就是5.即使再创建Match对象时设置了

RegexOptions.RigthToLeft,返回值依

然不变.

          myMatch.Groups属性,返回一个GroupCollection对象,其中封装了多个Match的对象,GroupCollection是一个普通的集合类,有Item和Count属性,常用的

是按照索引来访问,如之前的Group[2].等等.,如果正则表达式有命名的捕获括号匹配,还可以这样:Group["yourName"].Value来访问匹配的文本值.

          注意:Group[0]表示整个正则表达式匹配的所有文本,我们之前说过的.所以myMatch.Groups[0].Value就和myMatch.Value是相等的.          

          myMatch.NextMatch方法,很好理解,大家可以和一些集合的迭代,如ArrayList的Next()方法类比,寻找下一个匹配,返回新的Match对象.

          

     2. Group对象

          其实这个对象和前面的Match对象的方法和属性很多一样的,可以这么说,Group是Match的一个特例(他们只是不是继承关系,我不清楚,,我没有查看MSDN),但

是从理解上至少是这样的,因为Match表示一个匹配,不管是什么的样的匹配,如:捕获匹配,还是一般的匹配,只要是一个匹配,我们就可以用Match来封装相关的信息,而

Group只是一个捕获性括号的匹配.

          下面介绍方法和属性:

          同样假设有一个Group对象 :myGroup.

          myGroup.Success属性:返回bool,说明一个分组是否参与了匹配,,不是所有的分组都参与匹配的.如,正则表达式"(abc)(def)"来匹配"abccc",那么只

有"(abc)"那个分组匹配成功了.

          myGroup.Value属性和myGroup.ToString方法:返回匹配的文本的副本,如上面的例子那个匹配分组的例子就返回"abc";

          myGroup.Length属性,返回整数,表示匹配的分组匹配的文本的长度,如上面就例子返回"3";

          myGroup.Index属性,返回分组匹配的文本的开始位置.如上面的例子就返回0.

 

     3.便捷函数.

          很多的时候,我们不用new一个Regex对象,因为Regex这个类有很多的方法来直接使用.

          Regex.IsMatch()调用这个静态的方法,来表示匹配是否成功

          Regex.Matches()

          Regex.Replace()

          Regex.Split()

          以上方法我不赘述了,和之前的一样.

 

     4 正则表达式的缓存

          为简单的正则表达式创建Regex对象不方便,而且也不浪费资源,所有我们可以用Regex类的一些静态方法(见上).但是这些静态的方法也是有缺陷的,因为每次调用的时候都会创建一个临时的Regex的对象,而且用一次就丢弃了.特别是再循环中时,开销更加大.所以为了避免重复的工作,可以缓存静态方法创建的临时变量.

          .NET Framework默认可以缓存15个正则表达式,如果再循环中使用的正则表达式超过了15个,那么第16个就取代第一个,如此类推.

          我们只要这样,这样:

          Regex.CacheSize=123;就可以将默认的缓存调整为你需要的.

          注意:一般系统缓存的是你最近用过的123个缓存,也就是说,.net已经有了内部机制来缓存,我们要知道这一点,而且只要设置CacheSize就可以了.

          

          好了,各位,就写到这里了,如果需要,以后的文章要谈谈正则表达式的内部机制.但是,是看看大家的需要啦!谢谢一直关注啊!

         

作者:小洋,燕洋天
出处:http://yanyangtian.cnblogs.com/

承接架构设计,性能优化(程序,数据库等方面)技术咨询

 

 

posted @ 2009-01-08 11:19 小洋(燕洋天) 阅读(2164) 评论(12) 编辑 收藏

 回复 引用   
#1楼2009-01-08 11:40 | 兰中[未注册用户]
怎么没有实例呀
 回复 引用 查看   
#2楼[楼主]2009-01-08 12:20 | 小洋      
@兰中
之前已经有很多的例子了,这里只是相当于再详细的提及以下.

 回复 引用   
#3楼2009-01-08 12:32 | 为难了[未注册用户]
其实我比较期待一些不常用但很实用的函数,属性的说明,不知道楼主有没有计划写一下
 回复 引用 查看   
#4楼2009-01-08 13:28 | 贼寇在何方      
MSDN上是这样画的
System.Object
System.Text.RegularExpressions.Capture
System.Text.RegularExpressions.Group
System.Text.RegularExpressions.Match

Match是继承自Group的啊

 回复 引用   
#5楼2009-01-08 17:20 | lvb[未注册用户]
感谢博主和大家一起分享, 不知博主有没有相关正则匹配的详解, 像大家一定会在搜索方面遇到这样那样的问题, 比如特殊字符处理等等。。
 回复 引用 查看   
#6楼2009-01-08 17:21 |       
第一次听说.NET 正则还有缓存,受教
 回复 引用 查看   
#7楼2009-01-08 21:32 | 一切从零      
不错!~谢谢了,支持
 回复 引用 查看   
#8楼2010-11-18 11:40 | gunnima      
期待后续文章,关注!
 回复 引用 查看   
#9楼2010-12-01 23:31 | Liyongqing      
飘过~~
 回复 引用 查看   
#10楼2011-07-18 19:57 | tokey\\      
谈谈正则表达式的内部机制吧,期待中。
 回复 引用 查看   
#11楼[楼主]2011-07-18 20:36 | 小洋(燕洋天)      
引用tokey\\:谈谈正则表达式的内部机制吧,期待中。

内部机制就要涉及编译原理了,例如有限自动机!那就复杂了!

 回复 引用 查看   
#12楼2011-07-19 10:32 | tokey\\      
@小洋(燕洋天)
那有空的话,能写些编译原理的文章不?

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1371698 cJvjCx0qHz0=
架构设计