快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

解读C#中的规则表达式

  多少年来,许多的编程语言和工具都包含对规则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。

  此外,regexp类还能够完成一些其他的功能,例如从右至左的结合模式和表达式的编辑等。

  在这篇文章中,我将简要地介绍System.Text.RegularExpression中的类和方式、一些字符串匹配和替换的例子以及组结构的具体情况,最后,还会介绍一些你可能会用到的常见的表达式。

应该把握的基础知识
  规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中,我们将假定你已经把握了规则表达式的用法,尤其是Perl 5中表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集,因此,从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和.NET架构的基本知识。

  假如你没有规则表达式方面的知识,我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里・弗雷德尔编写的《把握表达式》一书,对于希望深刻理解表达式的读者,我们强烈建议阅读这本书。

RegularExpression组合体
  regexp规则类包含在System.Text.RegularExpressions.dll文件中,在对应用软件进行编译时你必须引用这个文件,例如,csc r:System.Text.RegularExpressions.dll foo.cs命令将创建foo.exe文件,它就引用了System.Text.RegularExpressions文件。

名字空间简介
  在名字空间中仅仅包含着6个类和一个定义,它们是:

  Capture: 包含一次匹配的结果;

  CaptureCollection: Capture的序列;

  Group: 一次组记录的结果,由Capture继续而来;

  Match: 一次表达式的匹配结果,由Group继续而来;

  MatchCollection: Match的一个序列;

  MatchEvaluator: 执行替换操作时使用的代理;

  Regex:编译后的表达式的实例。

  Regex类中还包含一些静态的方式:

  Escape: 对字符串中的regex中的转义符进行转义;

  IsMatch: 假如表达式在字符串中匹配,该方式返回一个布尔值;

  Match: 返回Match的实例;

  Matches: 返回一系列的Match的方式;

  Replace: 用替换字符串替换匹配的表达式;

  Split: 返回一系列由表达式决定的字符串;

  Unescape:不对字符串中的转义字符转义。

简朴匹配
  我们首先从使用Regex、Match类的简朴表达式开始学习。

  Match m = Regex.Match(\"abracadabra\", \"(a|b|r)+\");

  我们现在有了一个可以用于测试的Match类的实例,例如:if (m.Success)...

  假如想使用匹配的字符串,可以把它转变成一个字符串:

  Console.WriteLine(\"Match=\"+m.ToString());

  这个例子可以得到如下的输出: Match=abra。这就是匹配的字符串了。

字符串的替换
  简朴字符串的替换异常直观。例如下面的语句:

  string s = Regex.Replace(\"abracadabra\", \"abra\", \"zzzz\");

  它返回字符串zzzzcadzzzz,所有匹配的字符串都被替换成了zzzzz。

  现在我们来看一个比较复杂的字符串替换的例子:

  string s = Regex.Replace(\" abra \", @\"^/s*(.*?)/s*$\", \"$1\");

  这个语句返回字符串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

本新闻共2页,当前在第1页  1  2  

本新闻共2页,当前在第1页  1  2  


返回类别: 教程
上一教程: Visual Studio.net Beta2安装
下一教程: 微软.NET平台中类型使用的基本原理----微软 .NET平台系列文章之二(译文/赵湘宁)

您可以阅读与"解读C#中的规则表达式"相关的教程:
· 再议正则表达式(这次是在asp.net 上的应用)
· .Net开放源码工程之二---正则表达式函数库
· 正则表达式测试程序
· 在 ASp+ 中的一些可能会用到的 小函数
· 漫谈.Net中的自动垃圾收集(Garbage Collection)机制(转)
    微笑服务 优质保证 索取样品