知识大全 完全解读C#.NET中的正则表达式

Posted 表达式

篇首语:傲不可长,欲不可纵,乐不可极,志不可满。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 完全解读C#.NET中的正则表达式相关的知识,希望对你有一定的参考价值。

完全解读C#.NET中的正则表达式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  多少年来 许多的编程语言和工具都包含对正则表达式的支持 NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类 而且它们也都与未来的Perl 中的规则表达式兼容      此外 regexp类还能够完成一些其他的功能 例如从右至左的结合模式和表达式的编辑等     在这篇文章中 我将简要地介绍System Text RegularExpression中的类和方法 一些字符串匹配和替换的例子以及组结构的详细情况 最后 还会介绍一些你可能会用到的常见的表达式      应该掌握的基础知识  规则表达式的知识可能是不少编程人员 常学常忘 的知识之一 在这篇文章中 我们将假定你已经掌握了规则表达式的用法 尤其是Perl 中表达式的用法 NET的regexp类是Perl 中表达式的一个超集 因此 从理论上说它将作为一个很好的起点 我们还假设你具有了C#的语法和 NET架构的基本知识     如果你没有规则表达式方面的知识 我建议你从Perl 的语法着手开始学习 在规则表达式方面的权威书籍是由杰弗里&# ;弗雷德尔编写的《掌握表达式》一书 对于希望深刻理解表达式的读者 我们强烈建议阅读这本书     RegularExpression组合体  regexp规则类包含在  System Text RegularExpressions dll文件中 在对应用软件进行编译时你必须引用这个文件 例如 csc r:System Text RegularExpressions dll foo cs命令将创建foo exe文件 它就引用了System Text RegularExpressions文件      名字空间简介  在名字空间中仅仅包含着 个类和一个定义 它们是     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*$ $ );     这个语句返回字符串abra 其前导和后缀的空格都去掉了      上面的模式对于删除任意字符串中的前导和后续空格都非常有用 在C#中 我们还经常使用字母字符串 在一个字母字符串中 编译程序不把字符 \\ 作为转义字符处理 在使用字符 \\ 指定转义字符时   @ 是非常有用的 另外值得一提的是$ 在字符串替换方面的使用 它表明替换字符串只能包含被替换的字符串       匹配引擎的细节  现在 我们通过一个组结构来理解一个稍微复杂的例子 看下面的  例子         string text   = abracadabra abracadabra abracadabra ;        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)                 //从组 开始         for (int i = ; i < gnums Length; i++)                    Group g = m Group(gnums[i]);        //获得这次匹配的组          Console WriteLine( Group +gnums[i]+ =[ +g ToString()+ ] );        //计算这个组的起始位置和长度          CaptureCollection cc = g Captures;          for (int j = ; j < cc Count; j++)                      Capture c = cc[j];           Console WriteLine( Capture + j + =[ +c ToString()             + ] Index= + c Index + Length= + c Length);                             //下一个匹配         m = m NextMatch();                 这个例子的输出如下所示         Group =[abra]            Capture =[abracad] Index= Length=             Capture =[abra] Index= Length=         Group =[cad]            Capture =[cad] Index= Length=         Group =[abra]            Capture =[abracad] Index= Length=             Capture =[abra] Index= Length=         Group =[cad]            Capture =[cad] Index= Length=         Group =[abra]            Capture =[abracad] Index= Length=             Capture =[abra] Index= Length=         Group =[cad]            Capture =[cad] Index= Length=      我们首先从考查字符串pat开始 pat中包含有表达式 第一个capture是从第一个圆括号开始的 然后表达式将匹配到一个abra 第二个capture组从第二个圆括号开始 但第一个capture组还没有结束 这意味着第一个组匹配的结果是abracad 而第二个组的匹配结果仅仅是cad 因此如果通过使用?符号而使cad成为一项可选的匹配 匹配的结果就可能是abra或abracad 然后 第一个组就会结束 通过指定+符号要求表达式进行多次匹配      现在我们来看看匹配过程中发生的情况 首先 通过调用Regex的constructor方法建立表达式的一个实例 并在其中指定各种选项 在这个例子中 由于在表达式中有注释 因此选用了x选项 另外还使用了一些空格 打开x选项 表达式将会忽略注释和其中没有转义的空格      然后 取得表达式中定义的组的编号的清单 你当然可以显性地使用这些编号 在这里使用的是编程的方法 如果使用了命名的组 作为一种建立快速索引的途径这种方法也十分有效      接下来是完成第一次匹配 通过一个循环测试当前的匹配是否成功 接下来是从group 开始重复对组清单执行这一操作 在这个例子中没有使用group 的原因是group 是一个完全匹配的字符串 如果要通过收集全部匹配的字符串作为一个单一的字符串 就会用到group 了      我们跟踪每个group中的CaptureCollection 通常情况下每次匹配 每个group中只能有一个capture 但本例中的Group 则有两个capture Capture 和Capture 如果你仅需要Group 的ToString 就会只得到abra 当然它也会与abracad匹配 组中ToString的值就是其CaptureCollection中最后一个Capture的值 这正是我们所需要的 如果你希望整个过程在匹配abra后结束 就应该从表达式中删除+符号 让regex引擎知道我们只需要对表达式进行匹配       基于过程和基于表达式方法的比较  一般情况下 使用规则表达式的用户可以分为以下二大类 第一类用户尽量不使用规则表达式 而是使用过程来执行一些需要重复的操作 第二类用户则充分利用规则表达式处理引擎的功能和威力 而尽可能少地使用过程      对于我们大多数用户而言 最好的方案莫过于二者兼而用之了 我希望这篇文章能够说明 NET语言中regexp cha138/Article/program/net/201311/12649

相关参考

知识大全 .NET开发正则表达式中BUG一例

故障解析:.NET开发正则表达式中BUG一例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  又发

知识大全 使用.NET正则表达式区分中英文

使用.NET正则表达式区分中英文  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要本文提供一个

知识大全 .NET下正则表达式应用四例[1]

.NET下正则表达式应用四例[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  确认有效电子邮

知识大全 .NET下正则表达式应用四例[2]

.NET下正则表达式应用四例[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#代码示例S

知识大全 ASP.NET使用正则表达式屏蔽垃圾信息

ASP.NET使用正则表达式屏蔽垃圾信息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  找资料看

知识大全 .NET开发中正则表达式中BUG一例

.NET开发中正则表达式中BUG一例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  又发现了一个

知识大全 .NET开发时使用正则表达式的BUG

.NET开发时使用正则表达式的BUG  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  又发现了一个

知识大全 .NET开发正则表达式中BUG故障解析

.NET开发正则表达式中BUG故障解析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  又发现了一

知识大全 全方位探讨.NET Framework正则表达式

全方位探讨.NETFramework正则表达式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  正

知识大全 the regulator特色工具

  Regulator是最后一个添加到我的头等工具清单中的它是一种很有特色的工具能够使生成和测试正则表达式变得很容易人们对正则表达式重新产生了兴趣因为它们在NET框架中受到很好的支持正则表达式用来基于