初探System.Text.RegularExpressions 命名空间

  今天在看一个网站代码的时候,正好要使用到这个命名空间的类,然后呢,来来回回按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"。

  转自:http://www.cnblogs.com/yike/

转载请注明:代码家园 » 初探System.Text.RegularExpressions 命名空间

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)