Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2329875
  • 博文数量: 145
  • 博客积分: 8668
  • 博客等级: 中将
  • 技术积分: 3922
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-09 21:21
个人简介

work hard

文章分类

全部博文(145)

文章存档

2016年(1)

2015年(1)

2014年(1)

2013年(12)

2012年(3)

2011年(9)

2010年(34)

2009年(55)

2008年(20)

2007年(9)

分类: LINUX

2009-04-29 17:30:33

3. 使用 Regular Expression 时的注意事项

学习 Regular Expression 除了应了解其中特殊字符所代表的意义外; 在实际应用时, 也有一些应该注意的事项. 倘若忽略了这些特点, 往往会 造成字符串无法正确比对, 而导至结果错误. 本节除了介绍这些应予留心的事 项外, 也提供各软件在解读 Regular Expression, 进行字符串比对时所依据的 二项重要原则.

接受 Regular Expression 的指令或工具, 它们找寻字符串时系按照下列二原则:

由左往右进行字符串找寻.
尽可能寻找最长且合于所指定 Regular Expression 的字符串.
例如 : 应用 Regexp `` a.*b''(代表以"a"开头以"b"结尾 的任意字符串),于数据列 ``12 3ab0aab4 56'' 中找寻合于该条件 的字符串.
该资料列中合于 Regexp `` a.*b'' 的字符串有 ``ab'', ``aab'', ``ab0aab''. 但按上列二原则「由左往右找, 且尽可能寻 找最长的字符串」 实际上被找到的字符串将为 ``ab0aab''.


Regular Expression 有许多不同的版本 UNIX 中不同的指令对同一个 Regular Expression 可能会有不同的解释. 原因是这些指令无法完全解释前节所述 Regular Expression 中所有的特殊字符. 这就是所谓 "Regular Expression 有许多不同的版本"

例如 : egrep 中对 Regexp `` an?'' 解释成字符串 ``a'' 或 ``an''. 但 vi 中对 Regexp `` an?'' 只解释成字符串 ``an?''. 因为 vi 中并不把 `` ?'' 当成 Regular Expression 的特殊字原解释.
Appendix A 附表 中列出 UNIX 中常用的指令及它所接受的 Regular Expression 特殊字符.

勿将Shell上所使用的字符串表示法(Pattern Matching Notation) 与 Regular Expression 混淆.
Regexp `` a*'' 用以表示一个完全由字符 "a" 所组成的任意长度字符串. 但在 Shell 命令列上执行 ``ls a*'', 却会列出目前工作目录下所有以 "a" 开头的档案与子目录.两者对 ``a*'' 的解释并不相同. 因为 Shell 所接受的是另一种名为 ``Pattern Matching Notation'' 的表示法, 两者并不相同请勿混淆.

在含有中文之文字文件中, 使用 Regular Expression 进行字符串找寻时, 可能会发生错误.
譬如 : 找寻左大括号"{", 结果中文的"程"也被找出. 这并非 Regular Expression 出了错误. 因每个中文字都是由 2 个 bytes 组成, 而中文``程''字的后一个 byte 恰 被解释成``{''.所以除非所使用的指令有自动避开中文字的功能, 否则中文字的后一个 byte 被误判的机率并不低. 故读者在含有中文文字的档案中, 进行字符串找寻并置换时, 最好是逐次确认后再行置换.

并非所有软件都接受 Regular Expression(有解读 Regular Expression 的能力). 一般而言,就算某软件(工具)可接受 Regular Expression , 它也并非把所有的字 串或参数当成 Regular Expression 解释. 读者使用 Regular Expression 时, 应先确定该软件会把该些字符串当成 Regular Expression 解释(可翻查其 manual page), 如此才可获得正确的结果.

阅读(3207) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~