BBS水木清华站∶精华区
使用 Regular Expression 时的注意事项
学习 Regular Expression 除了应了解其中特殊字元所代表的意义外; 在实际应用时,
也有一些应该注意的事项. 倘若忽略了这些特点, 往往会 造成字串无法正确比对, 而
导至结果错误. 本节除了介绍这些应予留心的事 项外, 也提供各软体在解读 Regular
Expression, 进行字串比对时所依据的 二项重要原则.
1. 接受 Regular Expression 的指令或工具, 它们找寻字串时系按照下列二原则:
1. 由左往右进行字串找寻.
2. 尽可能寻找最长且合於所指定 Regular Expression 的字串.
+ 例如 : 应用 Regexp `` a.*b''(代表以"a"开头以"b"结尾 的任意字
串),於资料列 ``12 3ab0aab4 56'' 中找寻合於该条件 的字串.
该资料列中合於 Regexp `` a.*b'' 的字串有 ``ab'', ``aab'',
``ab0aab''. 但按上列二原则「由左往右找, 且尽可能寻 找最长的字
串」 实际上被找到的字串将为 ``ab0aab''.
2. Regular Expression 有许多不同的版本 UNIX 中不同的指令对同一个 Regular
Expression 可能会有不同的解释. 原因是这些指令无法完全解释前节所述
Regular Expression 中所有的特殊 字元. 这就是所谓 "Regular Expression 有
许多不同的版本"
o 例如 : egrep 中对 Regexp `` an?'' 解释成字串 ``a'' 或 ``an''. 但
vi 中对 Regexp `` an?'' 只解释成字串 ``an?''. 因为 vi 中并不把 ``
?'' 当成 Regular Expression 的特殊字原解释.
Appendix A 附表 中列出 UNIX 中常用的指令及它所接受的 Regular Expression
特殊字元.
3. 勿将Shell上所使用的字串表示法(Pattern Matching Notation) 与 Regular
Expression 混淆.
Regexp `` a*'' 用以表示一个完全由字元 "a" 所组成的任意长度字串. 但在
Shell 命令列上执行 ``ls a*'', 却会列出目前工作目录下所有以 "a" 开头的档
案与子目录.两者对 ``a*'' 的解释并不相同. 因为 Shell 所接受的是另一种名
为 ``Pattern Matching Notation'' 的表示法, 两者并不相同请勿混淆.
4. 在含有中文之文字档中, 使用 Regular Expression 进行字串找寻时, 可能会发
生错误.
o 譬如 : 找寻左大括号"{", 结果中文的"程"也被找出. 这并非 Regular
Expression 出了错误. 因每个中文字都是由 2 个 bytes 组成, 而中文``
程''字的後一个 byte 恰 被解释成``{''.所以除非所使用的指令有自动避
开中文字的功能, 否则中文字的後一个 byte 被误判的机率并不低. 故读者
在含有中文文字的档案中, 进行字串找寻并置换时, 最好是逐次确认後再行
置换.
5. 并非所有软体都接受 Regular Expression(有解读 Regular Expression 的能
力). 一般而言,就算某软体(工具)可接受 Regular Expression , 它也并非把所
有的字 串或参数当成 Regular Expression 解释. 读者使用 Regular
Expression 时, 应先确定该软体会把该些字串当成 Regular Expression 解释
(可翻查其 manual page), 如此才可获得正确的结果.
BBS水木清华站∶精华区