正则表达式

正几天做的工作需要用到正则表达式,学习了一些基本的语法知识以后就开始上马了,做的虽然不算顺利但是也还可以,加班加点终于在最后把任务搞定了。

在.net3.5中, System.Text.RegularExpressions Namespace总共包含了10个类,其层次结构为:

Capture(CaptureCollection)<-Group(GroupCollection)<-Match(MatchCollection) 和Regex等。

Regex中最中的两个方法就是matchs和match,其中matchs是一个MatchCollection类型的,它包含了多个match。

Eg: string str = "one car two car three car";

       Regex r = new Regex(@"(\w)+\s+(car)");

与此正则表达式相符合总共有三个字符串:one car, two car , three car 他们都存放在matchs中(MatchCollection),而每一个都是一个match。

在.net3.5中,Group是用()来表示,如上例它总共有三个Group(捕获组),即Match本身和(\w)和(car)。Match是从Group继承过来,因此Match.Group[0]就是Match本身。

Group有两种类型:(exp)普通捕获组,命名捕获组(?<Name>exp),非捕获组(?:exp)

他们的引用顺序是:从普通组到命名组,从左到右,确定顺序(即:普通组的先确定,然后再确定命名组)

Eg:r.Groups[1], r.Groups[2].......

一个捕获组会有有0个1个或者多个Capture,我再最开始的时候对此一直很迷惑,什么叫一个组会有多个capture呢?难道是相捕获组一样,再一个组里面再用括号去划分capture?思考了几天一直没有得到好的结果,最后再网上查了相关的资料才搞清楚。0个capture很好理解,就是没有捕获到撒,一个或者多个其实是由于组后面跟有的数量词引起的:如 *(0次或者多次) 或者?(0次或者一次)或者+(一次或者多次)。

Eg:例如再上例中,(\w)+会匹配到o,n,e但是最终存到组里面就是e了,它会保留最后一次匹配到的值。因此这个Group有三个capture即:o,n,e。((*^__^*) 嘻嘻……,到这里终于弄明白了)

Summary:一般来说我们的调用顺序一般都是Matchs得到所有的匹配,然后用MatchCollection去取每个Match(Mathcs[])或者直接用match引用,

然后用GrouCollection取Group(Match.Groups),然后用CaptureCollection取capture,所有的事情就都ok了。

Eg:

  Regex r = new Regex();

  MatchCollection s1 = r.Matches(str);

  Match s2 = s1[1];

  GroupCollection s3 = s2.Groups

  Group s4 = s3[1];

  CaptureCollection s5 = s4.Captures

  Capture s6 = s5[1];

 

posted @ 2008-09-19 22:05  GrPro.Liu  阅读(262)  评论(2编辑  收藏  举报