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

开发 后端
C#正则表达式匹配引擎的细节是什么呢?C#正则表达式匹配引擎的细节需要注意什么呢?那么本文就向你介绍相关的内容。

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

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

  1. string text = "abracadabra1abracadabra2abracadabra3";   
  2.      
  3. string pat = @"   
  4.      
  5. ( # ***个组的开始   
  6.      
  7.  abra # 匹配字符串abra   
  8.      
  9.  ( # 第二个组的开始   
  10.      
  11.  cad # 匹配字符串cad   
  12.      
  13.  )? # 第二个组结束(可选)   
  14.      
  15. ) # ***个组结束   
  16.      
  17. + # 匹配一次或多次   
  18.      
  19. ";   
  20.      
  21. //利用x修饰符忽略注释   
  22.      
  23. Regex r = new Regex(pat, "x");   
  24.      
  25. //获得组号码的清单   
  26.      
  27. int[] gnums = r.GetGroupNumbers();   
  28.      
  29. //***匹配   
  30.      
  31. Match m = r.Match(text);   
  32.      
  33. while (m.Success)   
  34.      
  35.  {   
  36.      
  37. //从组1开始   
  38.      
  39.  for (int i = 1; i < gnums.Length; i++)   
  40.      
  41. {   
  42.      
  43. Group g = m.Group(gnums[i]);   
  44.      
  45. //获得这次匹配的组   
  46.      
  47. Console.WriteLine("Group"+gnums[i]+"=["+g.ToString()+"]");   
  48.      
  49. //计算这个组的起始位置和长度   
  50.      
  51. CaptureCollection cc = g.Captures;   
  52.      
  53. for (int j = 0; j < cc.Count; j++)   
  54.      
  55.  {   
  56.      
  57.  Capture c = cc[j];   
  58.      
  59.  Console.WriteLine(" Capture" + j + "=["+c.ToString()   
  60.      
  61.  + "] Index=" + c.Index + " Length=" + c.Length);   
  62.      
  63.  }   
  64.      
  65. }   
  66.      
  67. //下一个匹配   
  68.      
  69.  m = m.NextMatch();   
  70.      
  71.  }  

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

  1. Group1=[abra]   
  2.      
  3. Capture0=[abracad] Index=0 Length=7   
  4.      
  5. Capture1=[abra] Index=7 Length=4   
  6.      
  7. Group2=[cad]   
  8.      
  9. Capture0=[cad] Index=4 Length=3   
  10.      
  11. Group1=[abra]   
  12.      
  13. Capture0=[abracad] Index=12 Length=7   
  14.      
  15. Capture1=[abra] Index=19 Length=4   
  16.      
  17. Group2=[cad]   
  18.      
  19. Capture0=[cad] Index=16 Length=3   
  20.      
  21. Group1=[abra]   
  22.      
  23. Capture0=[abracad] Index=24 Length=7   
  24.      
  25. Capture1=[abra] Index=31 Length=4   
  26.      
  27. Group2=[cad]   
  28.      
  29. Capture0=[cad] Index=28 Length=3  

我们首先从考查字符串pat开始,pat中包含有表达式。***个capture是从***个圆括号开始的,然后表达式将匹配到一个abra。第二个capture组从第二个圆括号开始,但***个capture组还没有结束,这意味着***个组匹配的结果是abracad ,而第二个组的匹配结果仅仅是cad。因此如果通过使用?符号而使cad成为一项可选的匹配,匹配的结果就可能是abra或abracad。然后,***个组就会结束,通过指定+符号要求表达式进行多次匹配。
  
现在我们来看看匹配过程中发生的情况。首先,通过调用Regex的constructor方法建立表达式的一个实例,并在其中指定各种选项。在这个例子中,由于在表达式中有注释,因此选用了x选项,另外还使用了一些空格。打开x选项,表达式将会忽略注释和其中没有转义的空格。
  
然后,取得表达式中定义的组的编号的清单。你当然可以显性地使用这些编号,在这里使用的是编程的方法。如果使用了命名的组,作为一种建立快速索引的途径这种方法也十分有效。
  
接下来是完成***次匹配。通过一个循环测试当前的匹配是否成功,接下来是从group 1开始重复对组清单执行这一操作。在这个例子中没有使用group 0的原因是group 0是一个完全匹配的字符串,如果要通过收集全部匹配的字符串作为一个单一的字符串,就会用到group 0了。
  
我们跟踪每个group中的CaptureCollection。通常情况下每次匹配、每个group中只能有一个capture,但本例中的Group1则有两个capture:Capture0和Capture1。如果你仅需要Group1的ToString,就会只得到abra,当然它也会与abracad匹配。组中ToString的值就是其CaptureCollection中***一个Capture的值,这正是我们所需要的。如果你希望整个过程在匹配abra后结束,就应该从表达式中删除+符号,让regex引擎知道我们只需要对表达式进行匹配。

C#正则表达式匹配引擎的细节的基本内容就向你介绍到这里,希望对你有所帮助。

【编辑推荐】

  1. C#正则表达式Match类浅析
  2. C#正则表达式MatchCollection类浅析
  3. C#正则表达式GroupCollection类浅析
  4. C#正则表达式CaptureCollection类浅析
  5. C#正则表达式Capture类简析
责任编辑:仲衡 来源: blueidea.com
相关推荐

2009-08-07 15:16:10

C#正则表达式

2009-09-16 17:15:57

正则表达式引擎

2009-08-20 13:38:58

C#正则表达式

2009-08-20 14:43:03

C#正则表达式Rege

2009-08-20 13:09:28

C#正则表达式

2009-08-20 15:10:33

C#正则表达式

2009-08-20 15:02:41

C#正则表达式

2009-08-20 15:06:51

C#正则表达式

2009-08-20 14:57:00

C#正则表达式

2009-09-16 18:08:14

正则表达式匹配单词

2009-08-13 15:02:52

C#正则表达式引擎贪婪

2009-08-20 13:34:36

C#正则表达式

2009-09-16 13:24:30

PHP正则表达式匹配

2009-08-20 13:26:35

C#正则表达式

2009-08-20 13:57:27

C#正则表达式

2009-08-03 17:27:14

C#正则表达式

2009-08-17 13:56:28

C#正则表达式入门

2009-08-20 13:30:38

C#正则表达式

2009-08-20 14:31:55

C#正则表达式字符串

2009-09-16 13:53:17

PHP正则表达式匹配
点赞
收藏

51CTO技术栈公众号