AI智能
改变未来

c#.net正则表达式大揭秘 不看白不看啊

  本文给出了在C#.net源码下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的元字符、规则、选项等。   
  关键字:正则表达式、元字符、字符串、匹配   
  1、正则表达式简介   
  正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如 HTML处理、日志文件分析和 HTTP 标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。   
  .NET 框架正则表达式并入了其他正则表达式实现的最常见功能,被设计为与 Perl 5 正则表达式兼容,.NET 框架正则表达式还包括一些在其他实现中尚未提供的功能,.NET 框架正则表达式类是基类库的一部分,并且可以和面向公共语言运行库的任何语言或工具一起使用。   
  2、字符串搜索   
  正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。正是元字符组为正则表达式提供了处理能力。当前,所有的文本编辑器都有一些搜索功能,通常可以打开一个对话框,在其中的一个文本框中键入要定位的字符串,如果还要同时进行替换操作,可以键入一个替换字符串,比如在Windows操作系统中的记事本、Office系列中的文档编辑器都有这种功能。这种搜索最简单的方式,这类问题很容易用String类的String.Replace()方法来解决,但如果需要在文档中识别某个重复的,该怎么办?编写一个例程,从一个String类中选择重复的字是比较复杂的,此时使用语言就很适合。   http://www.trnpx.com
  一般表达式语言是一种可以编写搜索表达式的语言。在该语言中,可以把文档中要搜索的文本、转义序列和特定含义的其他字符组合在一起,例如序列/b表示一个字的开头和结尾(子的边界),如果要表示正在查找的以字符th开头的字,就可以编写一般表达式/bth(即序列字符界是-t-h)。如果要搜索所有以th结尾的字,就可以编写th/b(序列t-h-字边界)。但是,一般表达式要比这复杂得多,例如,可以在搜索操作中找到存储部分文本的工具性程序(facility)。
 由于限定符,捕获组可以在单个匹配中捕获多个字符串。Captures属性(CaptureCollection 类的对象)是作为 Match 和 group 类的成员提供的,以便于对捕获的子字符串的集合的访问。例如,如果使用正则表达式 ((a(b))c)+(其中 + 限定符指定一个或多个匹配)从字符串\”abcabcabc\”中捕获匹配,则子字符串的每一匹配的 Group 的 CaptureCollection 将包含三个成员。
  下面的程序使用正则表达式 (Abc)+来查找字符串\”XYZAbcAbcAbcXYZAbcAb\”中的一个或多个匹配,阐释了使用 Captures 属性来返回多组捕获的子字符串。
  using System;
  using System.Text.RegularExpressions;
  public class RegexTest
  {
  pblic static void RunTest()
  {
  int counter;
  Match m;
  CaptureCollection cc;
  GroupCollection gc;
  Regex r = new Regex(\”(Abc)+\”); //查找\”Abc\”
  m = r.Match(\”XYZAbcAbcAbcXYZAbcAb\”); //设定要查找的字符串
  gc = m.Groups;
  //出查找组的数目
  Console.WriteLine(\”Captured groups = \” + gc.Count.ToString());
  // Loop through each group.
  for (int i=0; i < gc.Count; i++) //查找每一个组
  {
  cc = gc.Captures;
  counter = cc.Count;
  Console.WriteLine(\”Captures count = \” + counter.ToString());
  for (int ii = 0; ii < counter; ii++)
  { http://www.trnpx.com
  // Print capture and position.
  Console.WriteLine(cc[ii] + \” Starts at character \” +
  cc[ii].Index); //输入捕获位置
  }
  }
  }
  public static void Main() {
  RunTest();
  }
  }
  此例返回下面的输出结果:
  Captured groups = 2
  Captures count = 1
  AbcAbcAbc Starts at character 3
  Captures count = 3
  Abc Starts at character 3
  Abc Starts at character 6
  Abc Starts at character 9
  3.6 Capture 类包含来自单个子表达式捕获的结果
  在 Group 集合中循环,从 Group 的每一成员中提取 Capture 集合,并且将变量 posn 和 length 分别分配给找到每一字符串的初始字符串中的字符位置,以及每一字符串的长度。
  Regex r;
  Match m;
  aptureCollection cc;
  int posn, length;
  r = new Regex(\”(abc)*\”);
  m = r.Match(\”bcabcabc\”);
  for (int i=0; m.Groups.Value != \”\”; i++)
  {
  cc = m.Groups.Captures;
  for (int j = 0; j < cc.Count; j++)
  {
  posn = cc[j].Index; //捕获对象位置
  length = cc[j].Length; //捕获对象长度
  }
  }
  把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果。如果希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销。对于单个的组,可以用以字符序列\”?:\”开头的组禁止这么做,就像URI样例那样。而对于所有的组,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture标志。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » c#.net正则表达式大揭秘 不看白不看啊