




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多少年来 许多的编程语言和工具都包含对规则表达式的支持 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 我们首先从考查字符串 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 的值 这正是我们所需要的 如果你希望整个 过程在匹配 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 0 变成大写 x char ToUpper x 0 x Substring 1 x Length 1 收集所有的字符 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 基于表达式的模式 完成上例中的功能的另一条途径是通过一个 MatchEvaluator 新的代码如下所示 static string CapText Match m 取得匹配的字符串 string x m ToString 如果第一个字符是小写 if char IsLower x 0 转换为大写 return char ToUpper x 0 x Substring 1 x Length 1 return x static void Main string text the quick red fox jumped over the lazy brown dog System Console WriteLine text text string pattern w string result Regex Replace text pattern new MatchEvaluator Test CapText System Console WriteLine result result 同时需要注意的是 由于仅仅需要对单词进行修改而无需对非单词进行修改 这个模 式显得非常简单 常用表达式 为了能够更好地理解如何在 C 环境中使用规则表达式 我写出一些对你来说可能有用 的规则表达式 这些表达式在其他的环境中都被使用过 希望能够对你有所帮助 罗马数字 string p1 m d c 0 3 c dm l x 0 3 x lc v i 0 3 i vx string t1 vii Match m1 Regex Match t1 p1 交换前二个单词 string t2 the quick brown fox string p2 S s S Regex x2 new Regex p2 string r2 x2 Replace t2 3 2 1 1 关健字 值 string t3 myval 3 string p3 w s s s Match m3 Regex Match t3 p3 实现每行 80 个字符 string t4 string p4 80 Match m4 Regex Match t4 p4 月 日 年 小时 分 秒的时间格式 string t5 01 01 01 16 10 01 string p5 d d d d d d Match m5 Regex Match t5 p5 改变目录 仅适用于 Windows 平台 string t6 C Documents and Settings user1 Desktop string r6 Regex Replace t6 user1 user2 扩展 16 位转义符 string t7 41 capital A string p7 0 9A Fa f 0 9A Fa f string r7 Regex Replace t7 p7 HexConvert 删除 C 语言中的注释 有待完善 string t8 传统风格的注释 string p8 匹配注释开始的定界符 匹配注释 匹配注释结束定界符 string r8 Regex Replace t8 p8 xs 删除字符串中开始和结束处的空格 string t9a leading string p9a s string r9a Regex Replace t9a p9a string t9b trailing string p9b s string r9b Regex Replace t9b p9b 在字符 后添加字符 n 使之成为真正的新行 string t10 ntest n string r10 Regex Replace t10 n n 转换 IP 地址 string t11 55 54 53 52 string p11 01 d d 2 0 4 d 25 0 5 01 d d 2 0 4 d 25 0 5 01 d d 2 0 4 d 25 0 5 01 d d 2 0 4 d 25 0 5 Match m11 Regex Match t11 p11 删除文件名包含的路径 string t12 c file txt string p12 string r12 Regex Replace t12 p12 联
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025房屋出租终止合同书
- 2025年保安考试1000道及答案
- 2025年氨合成考试试题及答案
- 《2025年自愿解除劳动合同协议书》
- 2025年安徽教师招考试卷及答案
- 2025年校医培训考试试题及答案
- 青海医保培训题库及答案
- 南岸餐厅铝单板施工方案
- 中山木纹铝格栅施工方案
- 攀枝花商场地板施工方案
- 核对考勤工作总结
- 供应商质量管理工程师SQE培训材料课件
- 业务回款冲刺方案
- 铁路信号继电器 信号继电器电路
- 居民死亡医学证明(推断)书+空白表
- 物业工程部库房管理规定
- 奶茶店消防应急预案
- 散文集《皮囊》读书分享PPT模板下载
- GB/T 17554.1-2006识别卡测试方法第1部分:一般特性测试
- GB 17790-2008家用和类似用途空调器安装规范
- 喷砂检验报告
评论
0/150
提交评论