• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 谈谈C# replace在正则表达式中的意义

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

作者:网站自由开发者 字体:[增加 减小] 来源:互联网 时间:2017-05-28

网站自由开发者 通过本文主要向大家介绍了谈谈360会员等级升级,谈谈天气,谈谈星座,谈谈会员中心产品建议,谈谈笑多了不怀孕等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

多少年来,许多的编程语言和工具都包含对正则表达式的支持,.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)+");
</div>

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

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

Console.WriteLine("Match="+m.ToString());
</div>

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

字符串的替换

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

string s = Regex.Replace("abracadabra", "abra", "zzzz");
</div>

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

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

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

这个语句返回字符串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(); 
   } 
</div>

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

 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
</div>

  我们首先从考查字符串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的值,

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 谈谈C# replace在正则表达式中的意义
  • 简单谈谈C#中深拷贝、浅拷贝

相关文章

  • 2018-01-28C# 获取文件夹路径和文件夹包含文件列表
  • 2017-05-28C#窗体间通讯的几种常用处理方法总结
  • 2017-05-28C#操作本地文件及保存文件到数据库的基本方法总结
  • 2017-05-28C#简单发送email的方法
  • 2017-05-28使用异步方式调用同步方法(实例详解)
  • 2017-05-28聊一聊C#接口问题 新手速来围观
  • 2017-05-28C#生成随机字符串的实例
  • 2017-05-28C#实现为一张大尺寸图片创建缩略图的方法
  • 2017-05-28怎么利用c#修改services的Startup type
  • 2017-05-28C#难点逐个击破(8):可空类型System.Nullable

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 解决C#中取消方向键对控件焦点控制的实现方法
    • 关于c#二叉树的实现
    • C#中使用反射获取结构体实例及思路
    • C#利用子线程刷新主线程分享教程
    • C#数据结构之堆栈(Stack)实例详解
    • C#从字符串中指定位置移除子字符串的方法
    • C#窗体全屏功能实例代码
    • C#实现洗牌游戏实例
    • c#同步两个子目录文件示例分享 两个文件夹同步
    • 使用位运算实现网页中的过滤、筛选功能实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有