博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

初探System.Text.RegularExpressions 命名空间

Posted on 2009-09-10 09:18  一刻  阅读(750)  评论(0编辑  收藏  举报
        今天在看一个网站代码的时候,正好要使用到这个命名空间的类,然后呢,来来回回按F1,跑MSDN去查,百度搜啊,搞得头昏脑胀,群里发啊发,没人鸟啊,现在终于弄得有些眉目了,想把它写下来,怕以后忘记了,也怕自己的理解还有错误,把它写出来,请各位指证,也供各位学习。
       System.Text.RegularExpressions 命名空间是做什么的呢,System.Text.RegularExpressions 命名空间包含一些类,这些类提供对 .NET Framework 正则表达式引擎的访问。该命名空间提供正则表达式功能,可以从运行在 Microsoft .NET Framework 内的任何平台或语言中使用该功能。
       这样说,或许还是比较难理解的(如果您和我一样是第一次接触这个命名空间的话),那么我们来举个例子
       string text="I am yike";
       string pat=@"\w+\s+(yike)";
       那么我们可以拿text去适当匹配pat正则表达式,并且获取匹配的结果。
       现在的问题是,我们怎么去匹配,匹配的结果是什么,怎么去获得,适当匹配又是什么意思,为什么说适当呢?
      一.怎么去匹配
         1.创建Regex对象,创建这个对象的方法有几个,您可以按F1查看它的构造函数,这里我们使用其中的一种。
          Regex regex=new Regex(pat)                                                   //这里的pat是我们上面定义的string
         2.创建Match对象,这里我们通过regex对象的Match方法返回值来实例化这个类
          Match match=regex.Match(text)                                             // 这里text是我们上面定义的string
           好,我们先来看下regex对象的Match静态方法是做什么的:在输入字符串中搜索正则表达式的匹配项,并将精确结果作为单个Match 对象返回
           回到例子,就是说,返回text中匹配pat的项,并且以Match对象返回,就是说我们把匹配pat的text放在Match对象中,那么我们怎么去获得呢?
         3.创建Group对象,这里我们通过match对象的Groups属性的返回值来实例化。
            Group group=match.Groups[1]
            我们看下Groups属性是怎么回事:获取由正则表达式匹配的组的集合。
         4.通过Group对象的value属性得到返回的值
             string result=group.value;
            对于这个result,它的值就是yike,为什么会是yike呢?开始我的想法跟您一样,其实这里它返回的只是正则表达式里面的()里面的值。现在至少您应该明白50%了,我们再换个例子,假如我这里的pat=@"(\w+)\s+(yike)",那么返回值会是什么呢?答案是am 和yike.它返回了两个值这也就是我们使用Groups组的理由了,如果是这样的话,那么我们这里的Groups[1]的值是am,Groups[2]的值是yike,当然他们属于同一个match对象,为什么这么说,难道有情况返回两个match对象的吗?
          答案是肯定的,我们再来看一个例子
           string text="I am yike,you are not yike";
            string pat=@"\w+\s+(yike)";
           Regex regex=new Regex(pat);
           MatchCollection matchCollection=regex.Matchs(text);   //这里它匹配到了"am yike" 和 "not yike" .他们分别是一个match对象,两个对象构成了一 个                                                                                                                  matchCollection
           int matchcount=matchCollection.Count;                         //返回匹配的match数,比如这里它是两个,那么返回2
           Match match=matchCollection.Item[0];                           //这里我们通过item属性返回某个指定的match对象
接下来的工作,相信您已经会做了,跟第一个例子一样。相信您已经比较清楚了,我们再做一个假定,假如我们把第一个例子的text也换成“I am yike,you are not yike”,那么显然它有两个匹配,但是对于第一种情况,它仍然只返回am yike.也就是返回第一个match对象。
         对了,我们还有一个适当匹配的问题没有解决,我们再举个例子吧。
            string text="I am YikE";
            string pat=@"\w+\s+(yike)"
            Regex regex=new Regex(pat,RegexOptions.IgnoreCase)  //这里在实例化的时候我们增加一个参数,也就是调用另外一个构造函数,RegexOptions是一个 
                                                                                                            //枚举,您可以查看F1去了解它的功能,这里  RegexOptions.IgnoreCase  是只匹配的时候不
                                                                                                            //  区分大小写 ,所以我们返回的result是am YikE 仍然匹配。 这里如果多个枚举我们用"|"分割,
                                                                                                            //比如   Regex regex=new Regex(pat,RegexOptions.IgnoreCase|RegexOptions.Multiline)
          是该提出我的问题的时候了,刚刚我们提到过Group[1],和Group[2].现在我的问题是,这里是否存在Group[0],如果存在,对于我们假定的例子,我们的Group[0]的值是不是等于"am yike"。
          如果您想更广泛地了解这个空间,您可以访问这里,如果您想更深入的了解这个空间请访问这里MSDN