君子务本 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