谈谈C# replace在正则表达式中的意义

2019-12-30 11:41:57刘景俊

 

这个语句返回字符串abra,其前导和后缀的空格都去掉了。 

  上面的模式对于删除任意字符串中的前导和后续空格都非常有用。在C#中,我们还经常使用字母字符串,在一个字母字符串中,编译程序不把字符“ ” 作为转义字符处理。在使用字符“”指定转义字符时,@"..."是非常有用的。另外值得一提的是$1在字符串替换方面的使用,它表明替换字符串只能包含被替换的字符串。 

匹配引擎的细节

  现在,我们通过一个组结构来理解一个稍微复杂的例子。看下面的例子: 


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(); 
   } 

这个例子的输出如下所示:  


 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