选择显示字体大小

解读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", "(abr)+");

  我们现在有了一个可以用于测试的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


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons