知识大全 解读C#中的规则表达式

Posted 表达式

篇首语:月缺不改光,箭折不改钢。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 解读C#中的规则表达式相关的知识,希望对你有一定的参考价值。

解读C#中的规则表达式  以下文字资料是由(全榜网网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类的作用以及它在性能和复杂性之间的优 劣点 基于过程的模式   我们在编程中经常需要用到的一个功能是对字符串中的一部分进行匹配或其他一些对字符串处理 下面是一个对字符串中的单词进行匹配的例子   string text = the quick red fox jumped over the lazy brown dog ;   System Console WriteLine( text=[ + text + ] );   string result = ;   string pattern = @ \\w+|\\W+ ;   foreach (Match m in Regex Matches(text pattern))      // 取得匹配的字符串    string x = m ToString();   // 如果第一个字符是小写    if (char IsLower(x[ ]))   // 变成大写     x = char ToUpper(x[ ]) + x Substring( x Length );   // 收集所有的字符    result += x;      System Console WriteLine( result=[ + result + ] );   正象上面的例子所示 我们使用了C#语言中的foreach语句处理每个匹配的字符 并完成相应的处理 在这个例子中 新创建了一个result字符串 这个例子的输出所下所示   text=[the quick red fox jumped over the lazy brown dog ]   result=[The Quick Red Fox Jumped Over The Lazy Brown Dog ]

cha138/Article/program/net/201311/12195

相关参考

下列关于行文规则的表达,错误的是

下列关于行文规则的表达,错误的是_____。A、向上级机关行文,原则上主送一个上级机关B、党委、政府的部门依据职权自行处理公务,不可相互行文C、报告中不得夹带请示事项D、各级党政机关一般不得越级行文答

知识大全 数据结构 4.6 从原表达式求后缀式的规则

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  从原表达式求得后缀式的规则为  )设立运算符栈  )设表达式的结束符为#预设

解读男人的“性”秘密

刘沂与陈思结婚一年了,但刘沂总觉得美满的生活中似乎还存在着不和谐的音符。“我给陈思一个拥抱或热吻的时候,她总是认为这是我对她提出性要求的表示,赶紧不冷不热地闪开。其实呢,我只是想表达一下爱意而已。接下

知识大全 详细解读JVM中的对象生命周期

详细解读JVM中的对象生命周期  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在JVM运行空间中

知识大全 解读.NET Framework中的COM+与MTS

解读.NETFramework中的COM+与MTS  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

这段文字中的“匠人规则”启示我们__

这段文字中的“匠人规则”启示我们_____A、规则是有标准有角、非常清楚的,钉就是钉,铆就是铆B、尊重规则、遵守规则,是做好一切事情的前提和根本C、规则可惩罚违反它的人,又可保护和赏赐遵守它的人D、规

成交量的三种表达方式

成交量的三种表达方式市场人士常说“股市中什么都可以骗人,唯有量是真实的”,可以说,成交量的大小直接表明了多空双方对市场某一时刻的技术形态最终的认同程度。江恩十二条买卖规则中的第七条就是观察成交量,指出

水质分析行业中的几种水质分析解读

近年来,伴随着工业自动化程度的不断提高;人力资源成本的不断攀升;国家十二五规划对饮用水安全、重点流域水污染防治等一系列因素都将在不同程度上推动中国水质分析仪表以较快速度发展。未来几年,对于中国的水质分

水质分析行业中的几种水质分析解读

近年来,伴随着工业自动化程度的不断提高;人力资源成本的不断攀升;国家十二五规划对饮用水安全、重点流域水污染防治等一系列因素都将在不同程度上推动中国水质分析仪表以较快速度发展。未来几年,对于中国的水质分

水质分析行业中的几种水质分析解读

近年来,伴随着工业自动化程度的不断提高;人力资源成本的不断攀升;国家十二五规划对饮用水安全、重点流域水污染防治等一系列因素都将在不同程度上推动中国水质分析仪表以较快速度发展。未来几年,对于中国的水质分