C#正则表达式匹配引擎的细节浅析

君子务本 2009-08-20

C#正则表达式匹配引擎的细节是什么呢?需要注意什么呢?让我们开始我们的讲述:

现在,我们通过一个组结构来理解一个稍微复杂的例子。看下面的C#正则表达式匹配引擎的细节例子:

string text = "abracadabra1abracadabra2abracadabra3";   


     



string pat = @"   



     


( # 第一个组的开始   


     


 abra # 匹配字符串abra   


     


 ( # 第二个组的开始   


     


 cad # 匹配字符串cad   


     


 )? # 第二个组结束(可选)   


     


) # 第一个组结束   


     


+ # 匹配一次或多次   


     


";   


     



//利用x修饰符忽略注释   



     



Regex r = new Regex(pat, "x");   



     



//获得组号码的清单   



     



int[] gnums = r.GetGroupNumbers();   



     



//首次匹配   



     


Match m = r.Match(text);   


     



while (m.Success)   



     


 {   


     



//从组1开始   



     



 for (int i = 1; i < gnums.Length; i++)   



     


{   


     


Group g = m.Group(gnums[i]);   


     



//获得这次匹配的组   



     



Console.WriteLine("Group"+gnums[i]+"=["+g.ToString()+"]");   



     



//计算这个组的起始位置和长度   



     


CaptureCollection cc = g.Captures;   


     



for (int j = 0; j < cc.Count; j++)   



     


 {   


     


 Capture c = cc[j];   


     



 Console.WriteLine(" Capture" + j + "=["+c.ToString()   



     



 + "] Index=" + c.Index + " Length=" + c.Length);   



     


 }   


     


}   


     



//下一个匹配   



     


 m = m.NextMatch();   


     


 }  

这个C#正则表达式匹配引擎的细节实例的输出如下所示:

Group1=[abra]   


     


Capture0=[abracad] Index=0 Length=7   


     


Capture1=[abra] Index=7 Length=4   


     


Group2=[cad]   


     


Capture0=[cad] Index=4 Length=3   


     


Group1=[abra]   


     


Capture0=[abracad] Index=12 Length=7   


     


Capture1=[abra] Index=19 Length=4   


     


Group2=[cad]   


     


Capture0=[cad] Index=16 Length=3   


     


Group1=[abra]   


     


Capture0=[abracad] Index=24 Length=7   


     


Capture1=[abra] Index=31 Length=4   


     


Group2=[cad]   


     


Capture0=[cad] Index=28 Length=3  

相关推荐