Regular Expression
时间:2007-05-16 来源:piaoyizu
Regular Expression 简介
中央研究院计算中心
ASPAC 计划
[email protected]
技术报告: 94019
1995 年 2 月 9 日
Version : 1.0
版权声明
目录
Why Regular Expression
组成 Regular Expression 的元素
使用 Regular Expression 时的注意事项
范 例
Appendix : Test using Regular Expression in various environments
HP-UX
Sun Solaris 2.X
AIX 3.2.5
GNU Tools
Why Regular Expression
Regular Expression 是一种字符串表达的方式. 使用者可使用一个简短的 Regular Expression 来表示 〝具有某特征〞 或者 〝复杂难以描述〞的所有字符串. 而日常数据处理中, 最常进行的工作是『从档案中找出具有某特征的字符串, 再加以处理(打印,置换, 计算...)』. 此时, Regular Expression 便可派上用场. 使用一个简短的 Regular Expression 便可完全指定需要加以处理的资料 , 避免反复判断找寻的困扰. 譬如 :
若使用 MS-DOS 中文字编辑器 edit 的找寻功能, 可来 找出档案中所有的 ``prg1.c''; 但 edit 却无法一次同 时找寻字符串``prg1.c''、``prg2.c'' ... 或 ``prg8.c''; 必需 反复执行八次找寻的动作.
可是在 UNIX 中的 vi , 使用一个 Regular Expression `` prg[0-8]\.c'' 便可同时表示上述八个字符串, 如此一次就可找出指定的所有字符串.
可见 Regular Expression 确实十分便利. 然而, MS-DOS 下许多工具的设计并不支持解读 Regular Expression. 但 UNIX 环境下除了 vi 外, 还有许多工具都接受 Regular Expression, 如 : grep、sed、awk、csplit... . 使用这些工具时, 便可应用 Regular Expression 来指定欲找寻的字符串; 并可配合这些工具的其它功能将找寻到的数据进一步地加以处理.
Regular Expression 的特色是简短且表达力强. 它所表达的可以是某一特定的字符串, 也可以是具有某一共同特征的"所有"字符串(如上例). Regular Expression 中定义了一组特殊字符, 它们代表着某些特别的意义; 使用者可藉这些特殊字符来表示字符串的下列特征 :
描述组成字符串的元素(components) : 例 如 : Regular Expression ``[Tt]he'' 代表字符串 ``The'' 或 ``the''.
限制字符串出现的位置 : 例 如 : Regular Expression ``^The'' 代表『出现于行首』的字符串 ``The''.
由于 Regular Expression 具有极佳的字符串表示能力. 往后, 读者若能多利用 UNIX 上接受 Regular Expression 的工具, 且灵活应用 Regular Expression; 则可避免撰写程序进行复杂字符串判断(parsing) 的麻烦. 如此, 才能真正发挥各工具的的功能, 减轻数据处理时的负担, 并增加数据处理的效率.
--------------------------------------------------------------------------------
Note 1
UNIX中定义了数种字符串表达方式, Regular Expression 及 Extended Regular Expression 是常见的二种. 另一种是使用于Shell命令列, 将参数展开}(expand)成文件名称的"Pattern Matching Notation", 这种表示法与 Regular Expressions 的语法差异较大, 甚至有数项用法相左, 故位未列入本文讨论以免读者混淆.
组成 Regular Expression 的元素
Regular Expression 是由普通字符、及一组具有特殊意义 的字符所构成. 本节主要介绍各种特殊字符所代表的意义及 其用法. 读者学习时应留心 : 有时, 同一特殊字符, 会因出 现在字符串中不同的位置或连接其它特殊字符, 而有不同的意义. 本文中为有别于一般的字符串, 所有 Regular Expression 都以粗体字体表示, 且加注``Regexp''于其前方.
组成 Regular Expression 的元素及所代表的意义如下 :
[普通字符] 除了``.''、``[''、``]''、``*''、``+''、``?''、 ``|''、``^''、``$''、``{''、``}''、``\''、 ``<''、``>''、``(''、``)'' 外之所有字符.
由普通字符所组成的 Regular Expression 其意义与原字符串字面意义相同. 例如 :
普通字符``A''也可当成一个 Regular Expression. Regexp `` A'' 与一般字符``A''代表相同的意义.
Regexp `` the'' 与一般字符串``the''代表相同的意义.
[ .] Metacharacter 用以代表任意一个字符. 须留心 UNIX Shell 中使用``?''表示任意一个字符, 使用``*''代表任意长 度的字符串(这是另一种称为 ``Pattern Matching Notation'' 的字符串表示法). Regular Expression 中则使用`` .'' 来代表``一个''任意字符(注 意: 并非任意长度的字符串). 而 Regular Expression 中`` *''另有 其它涵意, 并不代表任意长度的字符串. 例如
Regexp `` .'' 可用以代表任意一个字符. 如 ``A''、``1''、``+''、...
Regexp `` ...'' 则代表一个由任意3个字符所的字符串. 譬如 ``123''、``abc''、``# 1''、...
[ ^] 限制字符串必须出现于行首. (用法见下例)
[ $] 限制字符串必须出现于行末.
[例如 :] Regexp `` ^The'' 用以表示所有出现于行首的字符串``The''. Regexp `` The$'' 用以表示所有出现于行末的字符串``The''. Regexp `` ^The$'' 则用以表示一个仅含字符串``The''的数据列. Regexp `` ^$'' 表示一个空白的数据列(行首与行尾之间未存在任一字符).
[ \] 将特殊字符还原成字面意义的字符. Regular Expression 中 特殊字符 将被解释成特定的意义. 若要表示特殊字符的字面(literal meaning) 意义时, 在 特殊字符之前加上 ``\'' 即可.
[例如 :] 使用 Regular Expression 来表示字符串``a.out''时, 不可写成 Regexp `` a.out''. 因为`` .''在 Regular Expression 中是特殊字符, 表示任一字符.
可合乎(match) Regexp `` a.out'' 的字符串将不只 ``a.out'' 一个; 字符串``a2out'',``a3out'', ``aaout''... 都合于 Regexp `` a.out''.
正确的表示法应为 : Regexp `` a\.out''
`` \'' 在 Regular Expression 中的另一个意 义是当成 Escape character.
[例如 :] `` \t'' 用以表示 tab. `` \n'' 表示换行符号.
[...] 『字符集合』, 用以表示两中括号间 所有的字符当中的任一个.
[例如 : ] Regexp `` [123]'' 可用以表示字符 ``1''、``2'' 或 ``3''. Regexp `` [Tt]'' 可用以表示字符 ``T'' 或 ``t''. 所以, Regexp " [Tt]he" 表示字符串 "The" 或 "the". (注意 : 一个字符集合仅代表``一个''字符.)
使用时, 需留心字符集合 [ ] 内不可随意留空白.
例如 : Regexp `` [ Tt ]'' 中括号内有空格符, 故除了可用 以表示字符``T''或``t''", 也可代表一个 `` ''(空格符).
- 字符集合中可使用 `` -'' 来指定字符的区间, 其用法如下:
Regexp `` [0-9]'' 等于 Regexp `` [0123456789]'' 用以表示任意 "一个" 阿拉伯数字. 同理 Regexp `` [A-Z]'' 用以表示任意 "一个" 大写英文字母.
但应留心 :
Regexp " [0-9a-z]" 并不等于 Regexp " [0-9][a-z]"; 前者表示一个字符(阿拉伯数字或小写英文字母), 后者表示二个字符.
Regexp " [-9]" 或 " [9-]" 仅用以代表字符 ``9''或 ``-''.
[ [\^{}... ]] 使用 [\^{...]} 产生字符集合的补集(complement set). 其用法如下 :
Regexp `` [^M]'' 用以表示除字符``M''外的``一个''任意字符
字符集合 `` [Tt]''表示字符 ``T'' 或 ``t''. 若要指定 ``T'' 或 ``t'' 之外的任一个字符, 可用Regexp `` [^Tt]'' 表示.
Regexp `` [^a-zA-Z]''表示英文字母之外的任一个字符.
需留心 `` ^''之位置; `` ^'' 必须紧接于 `` ['' 之后, 才代表字符集合的补集.
[例如 :] Regexp `` [0-9^]'' 表示一个阿拉伯数字或字符 `` ^'', 并非代表阿伯数字外的任意字符.
* 用以形容其前的字符或字符集合可重复任意次数的特殊字符.
`` *'' 形容它前方之字符(或字符集合)可出现 1 次或多次, 或不出现. 例如 :
Regexp ``ab*'' 中, `` *'' 形容它前方的字符 ``b'' 可出现 1 次或多次, 或不出现. 所以, Regexp ``ab*'' 可表示字符串 ``a''、``ab''、``abb''、 ``abbb''、...
Regexp `` T[0-9]*\.c'' 中, 使用 `` *'' 形容其前的字符集合 `` [0-9]''(一个阿拉伯数字)出现的次数 : 可为 0 次或多次.
故 Regexp `` T[0-9]*\.c''可用以表示 ``T.c''、``T0.c''、 ``T1.c''、``T2.c''、...、``T9.c''、``T00.c''、``T01.c''、``T02.c''、...、 ``T09.c''、``T10.c''、...``T99.c''、``T000.c''、...
[ \<] `` \< Regexp'' 表示一个出现于"前缀"且又合于(match)该 Regexp 的字符串 (用法见下例).
[ \>] ``Regexp \>'' 表示一个出现于"字末"且又合于(match)该 Regexp 的字符串.
这里所谓的``字(word)''系指被 tab、逗点、句点或空格符(space) 所分隔开的字符串.
[例如 :]
资料 ``One is red, and the other is white.'' 中 字符串 ``One'', ``is'', ``red'', ``and'', ``the'', ``other'', ``is'', ``white'' 便是所谓的 "字(word)". 而该资料列中,
合于 Regexp ``[Tt]he''的字符串如下(粗体字标示)
``One is red, and the other is white.''
合于 Regexp `` \<[Tt]he\>''却仅有(粗体字标示)
``One is red, and the other is white.''
因同时使用`` \<''及`` \>'' 限制合于 Regexp `` [Tt]he''的字符串, 必须紧接于前缀及字尾之间; 故 ``other''中的子字符串 ``the''并不合于这个 Regular Expression.
[注 :] \<, \> 这二个特殊字符, 并不是很通用. 请参考 Appendix A 中的附表.
\( ... )\ 于 Regular Expression 中使用 `` \(''``{ \)}''来括住一部分的 Regular Expression; 其后可用 `` \1'''来表示第一次被`` \('' `` \)'' 括住的部份. 若 Regular Expression 中使用了数次`` \('' `` \)'' 来括住不同的部分, 则依次使用 ``\1'', `` \2'', `` \3'' ,...(最多可用到 `` \9'')来 表示之前括住的 Regular Expression. 其用法如下 :
[用法一.]
例如: 欲表示像``aa'',``bb'',``cc'',...``zz'' 等字符串.
使用 Regexp `` [a-z]''则表示任一个小写的英文字母.
使用 Regexp `` [a-z][a-z]''则表示二个任意的小写英文字母. 它除表示 ``aa'',``bb'',``cc'',...``zz''等字符串外, 也可表示``ab'', ``ac'',``ad'',...等字符串(这不是题意所要求的字符串).
这时可以`` \('' `` \)'' 来括住第一个 `` [a-z]'' (Regular Expression 解译的程序, 会暂时记录实际找寻 到的英文字母). 之后, 便可以 Regexp ``\1'' 来指定适才被记 录下的英文字母即为所要找寻字符串的第二个字符. 故正确的表示法如下 :
Regexp `` \([a-z]\)\1''
例如 : 欲表示像 ``789w987'', ``abcwcba'', ``theweht'',....等具对称性 的字符串.(该字符串的特征是 ``w''之前后三个字符相互对称) 该类字符串的表示法如 下 :
Regexp `` \(.\)\(.\)\(.\)w\3\2\1" Regexp中`` .''表示任意一个字符. 因字符``w''之前出现的三个字符并无 任何限制, 故可用 `` ...''表之. 但每个`` .''分别用 `` \('',`` \)'' 括住, 之后便可使用 `` \1'', `` \2'', `` \3'' 分别代表将来实际匹配到的前三个字符.
用法二. 进行字符串找寻并置换(Replace)时, 若将被置入的新字符串不是一个固定的字符串, 与被找到的原字符串有关时(见下例说明). 此时, 可先以 \( \)来括住一部分的Regular Expression; 再于将被新置入的字符串中使用`` \1'', `` \2'',... 来表示当时被找到的字符串(或其子字符串).
例 : 欲找出档案中具有 ``prog12.c'', ``prog9.c'', ``prog832.c'',... 等式样的字符串, 并将其置换成(以上列三个字符串为例) ``[ note 12]'', ``[ note 9]'', ``[ note 832]''. 在这例子中, 因事先不知道所找寻到的字符串(prog数字.c)中的 数字 为何, 故无法事先决定应换成什么新字符串. 合于本例所要找寻的字符串其 Regular Expression 为 :
Regexp `` prog[0-9][0-9]*\.c'' 上式中 `` [0-9][0-9]*'' 表一位或一位以上的阿拉伯数字, 因 执行前并不知道该部分实际会匹配什么数值, 故找到的字符串将来应置换 成什么, 事前无法指定. 这情况, 也可用`` \('',`` \)'' 来括住 `` [0-9][0-9]* '', 在置换的新字符串中再以 \1 表示找寻时实际匹配到的数字.
读者可编辑一数据文件, 再以sed执行下列命令, 观察其执行结果.
$sed -e 's/ prog\([0-9][0-9]*\)\.c/[ note \1]/g' 资料文件名
\{ 数字, 数字\} 一种于 Regular Expression 中形容其前的字符或字符 集合出现次数的表示法. 其型态与用法如下 :
\{下限数字, 上限数字\}
例如 : Regexp "[0-9]\{2,4\}"用以表示2到4位的阿拉伯数字.
{ 数字}
例如 : Regexp `` ax\{99\}'' 用以表示一个 ``a'' 之后接上99个 ``x'' 所组成的字符串.
\{下限数字, \} 例如 : Regexp `` ax\{2,\}'' 用以表示一个 ``a'' 之后接上2个或更多的 ``x''所组成的字符串.
+ 形容其前的字符或字符集合出现一次或一次以上(注三).
例如 : Regexp `` [0-9]+'' 用以表示一位或一位以上的数字.
? 形容其前的字符或字符集合可出现一次或不出现(注三).
[例如 :] Regexp ``[+-]?[0-9]+'' 表示数字(一位以上)之前可出现一个正负号 或不出现正负号.
[ (...)] 用以括住一群字符,且将之视成一个group(见下面说明)(注三)
例如 :
Regexp `` 12+'' 表示字符串 "12","122","1222","12222",...
Regexp `` (12)+'' 表示字符串 "12","1212","1212","1212"....
上式中字符串 ``12''以( )括住,整个视为一个group, 故被重复符号``+'' 所形容的是``12''而非 ``2'', 重复出现的也是 ``12''.
| 表示逻辑上的 "or" (注三)
例如 : Regexp `` Oranges?|apples?|water'' 可用以表示字符串``Orange'', ``Oranges''
或 ``apple'', ``apples''
或 ``water''
注三 : 上列 + , ?, (...), | 等用法, 为 Extended Regular Expression 中新增列的用法. awk 及 egrep 中所使用的 Regular Expression 即为 Extended Regular Expression. 但 vi, sed, grep,...等软件中并无这些用法.
& ``&''并非 Regular Expression 中的特殊字符. 但以 Regular Expression 进行字符串找寻置换(Replace)时, 常会用到 ``\&''. \ 在许多 Unix tool 中, 当 ``\&''出现在『将被置入的新字符串』时, 它用以表示 ``实际被找到合于所指定的 Regular Expression 的字符串'' (见下例说明)
例如 : 找出档案中所有合乎 Regexp ``a[0-9]*\.c'' 的字符串, 并在其前后加上小 括号.依题意要求, 档案中所有如 ``a12.c'', ``a932.c'', ``a45.c'' ,...等字符串都应置换为 ``(a12.c)'', ``(a932.c)'', ``(a45.c)'',.. . . 遇到这情况,可令『将被置入的新字符串』为 `` (&)'' 此时, ``&''便是用来表示实际上被找到合于 Regexp ``a[0-9]*\.c'' 的字符串.
下列是使用 UNIX 上不同的工具, 来处理本例要求的字符串置换.
vi 以 vi 编辑该档案,并在 vi 命令输入模式下输入
: s/a[0-9]*\.c/(&)/g
sed 执行如下命令 ( $ 表 Shell 命令列的提示符号 )
$ sed -e 's/a[0-9]*\.c/ (&)/g' 数据文件名称
awk 执行如下命令 ( $ 表 Shell 命令列的提示符号 )
$ awk '{ gsub(/a[0-9]*\.c/, "(&)"); print }' 数据文件名称
--------------------------------------------------------------------------------
Note 2:
上列字符在 Regular Expression 中代表特殊意义, 称之为 特殊字符. 但 Unix 中不同的指令对 Regular Expression 的解释能力不尽相同, 故对特殊字符也有不同的认定. 请参考尾页附表.
使用 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), 如此才可获得正确的结果.
范 例
本节列出数个 Regular Expression 的应用简例, 供读者参考. 由这些范例中, 读者可一窥实际应用时, 如何藉由 Regular Expression 来表达字符串, 来完成 某些目的. 至于各指令像 vi, sed, awk, ...中之语法说明已非本文所能涵盖, 读者请自行参考相关书籍.
a. 将档案中所有字符串 ``Regular Expression'' 或 ``Regular expression'' 换成 ``Regexp''.
以 vi 编辑该档案, 并在 vi 命令输入模式下执行 :
:1,$ s/ Regular [Ee]xpression/Regexp/g
b. 将档案中所有具 ``ddd-dddd'' 特征的字符串(d表阿拉伯数字)之前插入字符串 ``Tel :''.
以 vi 编辑该档案, 并在, vi 命令输入模式下执行 :
:1,$ s/[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]/Tel:&/g
说明 : `` &'' 代表执行时实际合于该 Regular Expression 的字符串.
c. 将档案中所有俱有 `` program数字.c'' 特征的字符串换成 ``test数字.f''.
解法 : 以vi编辑该档案, 并在vi命令输入mode下执行 :
:1,$ s/ program\([0-9][0-9]**\)\.c/test\1.f/g
说明 : Regexp `` [0-9][0-9]*'' 表示一位或一位以上的阿拉伯数字. `` \1'' 被找到的字符串中的数值部分. (被\(...\)括住的部分).
d. 将档案中第5-13行, 整个区域往右移5格(空格符).
解法 : 以vi编辑该档案, 并在vi命令输入mode下执行
:5,13 s/ .*/ &/
说明 : Regexp `` .*" 用以 match 整个数据列(之后以&表之). 并用 `` &''(5个空白及原先之资料列)取代该列资料.
e. 将上例档案中的数据列(5-13行), 往左移回3格.
解法 : 以vi编辑该档案, 并在vi命令输入mode下执行
:5,13 s/ \^ ///
说明 : 将行首的三个空格符换成空字符串.
f. 试从一个档案的全名中分离出其路径及文件名.
解法 : 编辑如下的script并取名为 ``sepname''
awk '
BEGIN {
match( ARGV[1], /.*\//)
print "path=", substr(ARGV[1], 1 ,RLENGTH-1)
print "name=", name = substr(ARGV[1], RLENGTH+1 )
} ' $1 }
执行 $ sepname /usr/local/bin/xdvi
结果印出 path= /usr/local/bin
name= xdvi
g. 将档案中以``From''或``from''为行首的数据打印出
执行 $ awk '/^[Ff]rom/ ' 数据文件文件名
h. 去除挡案中空白行
执行 $ sed -e "/ ^$/d"
后 语
虽然 Regular Expression 仅是一种字符串的表示方式, 但从上列的范例 中不难窥出, 配合接受 Regular Expression 的指令或工具, 其应用面 将远超出找寻字符串及置换字符串. 使用 Regular Expression 不仅扩大了 字符串的表达能力, 让使用者很容易进行字符串判断; 使数据处理的过程便 为更为迅速便利.
Appendix : Test using Regular Expression in various environments
HP-UX
下表列出测试 HP-UX Release 9.0 中常见的工具对 Regular Expression 中各种特殊字符的接受能力.
ex vi sed awk grep egrep 说明
. * * * * * *
* * * * * * *
^ * * * * * *
$ * * * * * *
\ * * * * * *
[ ] * * * * * *
\( \)与\1...\9 合用(一) * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * * * - - 把\1...\9用于欲置换的新字符串中
{重复次数} * *
{下限,上限} * *
{下限, } * *
\< \> * *
+ * *
? * *
| * *
( ) * *
\ * * * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
Sun Solaris 2.X
下表列出测试 Sun Solaris 2.x 中常见的工具对 Regular Expression 中各种特殊字符的接受能力
ex vi sed awk grep egrep 说明
. * * * * * *
* * * * * * *
^ * * * * * *
$ * * * * * *
\ * * * * * *
[ ] * * * * * *
\( \)与\1...\9 合用(一) * * * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * * * - - 把\1...\9用于欲置换的新字符串中
{重复次数} * * * *
{下限,上限} * * * *
{下限, } * * * *
\< \> * * * *
+ * *
? * *
| * *
( ) * *
\ * * * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
AIX 3.2.5
下表列出测试 AIX 3.2.5 中常见的工具对 Regular Expression 中各种特殊字符的接受能力.
ex vi sed awk grep egrep 说明
. * * * * * *
* * * * * * *
^ * * * * * *
$ * * * * * *
\ * * * * * *
[ ] * * * * * *
\( \)与\1...\9 合用(一) * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * * * - - 把\1...\9用于欲置换的新字符串中
{重复次数} * *
{下限,上限} * *
{下限, } * *
\< \> * *
+ * *
? * *
| * *
( ) * *
\ * * * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
GNU Tools
下表列出测试 GNU 所提供的工具对 Regular Expression 中各种特殊字符的接受能力.
sed awk grep -G egrep -E emacs 说明
. * * * * *
* * * * * *
^ * * * * *
$ * * * * *
\ * * * * *
[ ] * * * * *
\( \)与\1...\9 合用(一) * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * - - * 把\1...\9用于欲置换的新字符串中
{重复次数} * *
{下限,上限} * *
{下限, } * *
\< \> * * * *
+ * * *
? * * *
| * *
( ) * *
\ * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
中央研究院计算中心
ASPAC 计划
[email protected]
技术报告: 94019
1995 年 2 月 9 日
Version : 1.0
版权声明
目录
Why Regular Expression
组成 Regular Expression 的元素
使用 Regular Expression 时的注意事项
范 例
Appendix : Test using Regular Expression in various environments
HP-UX
Sun Solaris 2.X
AIX 3.2.5
GNU Tools
Why Regular Expression
Regular Expression 是一种字符串表达的方式. 使用者可使用一个简短的 Regular Expression 来表示 〝具有某特征〞 或者 〝复杂难以描述〞的所有字符串. 而日常数据处理中, 最常进行的工作是『从档案中找出具有某特征的字符串, 再加以处理(打印,置换, 计算...)』. 此时, Regular Expression 便可派上用场. 使用一个简短的 Regular Expression 便可完全指定需要加以处理的资料 , 避免反复判断找寻的困扰. 譬如 :
若使用 MS-DOS 中文字编辑器 edit 的找寻功能, 可来 找出档案中所有的 ``prg1.c''; 但 edit 却无法一次同 时找寻字符串``prg1.c''、``prg2.c'' ... 或 ``prg8.c''; 必需 反复执行八次找寻的动作.
可是在 UNIX 中的 vi , 使用一个 Regular Expression `` prg[0-8]\.c'' 便可同时表示上述八个字符串, 如此一次就可找出指定的所有字符串.
可见 Regular Expression 确实十分便利. 然而, MS-DOS 下许多工具的设计并不支持解读 Regular Expression. 但 UNIX 环境下除了 vi 外, 还有许多工具都接受 Regular Expression, 如 : grep、sed、awk、csplit... . 使用这些工具时, 便可应用 Regular Expression 来指定欲找寻的字符串; 并可配合这些工具的其它功能将找寻到的数据进一步地加以处理.
Regular Expression 的特色是简短且表达力强. 它所表达的可以是某一特定的字符串, 也可以是具有某一共同特征的"所有"字符串(如上例). Regular Expression 中定义了一组特殊字符, 它们代表着某些特别的意义; 使用者可藉这些特殊字符来表示字符串的下列特征 :
描述组成字符串的元素(components) : 例 如 : Regular Expression ``[Tt]he'' 代表字符串 ``The'' 或 ``the''.
限制字符串出现的位置 : 例 如 : Regular Expression ``^The'' 代表『出现于行首』的字符串 ``The''.
由于 Regular Expression 具有极佳的字符串表示能力. 往后, 读者若能多利用 UNIX 上接受 Regular Expression 的工具, 且灵活应用 Regular Expression; 则可避免撰写程序进行复杂字符串判断(parsing) 的麻烦. 如此, 才能真正发挥各工具的的功能, 减轻数据处理时的负担, 并增加数据处理的效率.
--------------------------------------------------------------------------------
Note 1
UNIX中定义了数种字符串表达方式, Regular Expression 及 Extended Regular Expression 是常见的二种. 另一种是使用于Shell命令列, 将参数展开}(expand)成文件名称的"Pattern Matching Notation", 这种表示法与 Regular Expressions 的语法差异较大, 甚至有数项用法相左, 故位未列入本文讨论以免读者混淆.
组成 Regular Expression 的元素
Regular Expression 是由普通字符、及一组具有特殊意义 的字符所构成. 本节主要介绍各种特殊字符所代表的意义及 其用法. 读者学习时应留心 : 有时, 同一特殊字符, 会因出 现在字符串中不同的位置或连接其它特殊字符, 而有不同的意义. 本文中为有别于一般的字符串, 所有 Regular Expression 都以粗体字体表示, 且加注``Regexp''于其前方.
组成 Regular Expression 的元素及所代表的意义如下 :
[普通字符] 除了``.''、``[''、``]''、``*''、``+''、``?''、 ``|''、``^''、``$''、``{''、``}''、``\''、 ``<''、``>''、``(''、``)'' 外之所有字符.
由普通字符所组成的 Regular Expression 其意义与原字符串字面意义相同. 例如 :
普通字符``A''也可当成一个 Regular Expression. Regexp `` A'' 与一般字符``A''代表相同的意义.
Regexp `` the'' 与一般字符串``the''代表相同的意义.
[ .] Metacharacter 用以代表任意一个字符. 须留心 UNIX Shell 中使用``?''表示任意一个字符, 使用``*''代表任意长 度的字符串(这是另一种称为 ``Pattern Matching Notation'' 的字符串表示法). Regular Expression 中则使用`` .'' 来代表``一个''任意字符(注 意: 并非任意长度的字符串). 而 Regular Expression 中`` *''另有 其它涵意, 并不代表任意长度的字符串. 例如
Regexp `` .'' 可用以代表任意一个字符. 如 ``A''、``1''、``+''、...
Regexp `` ...'' 则代表一个由任意3个字符所的字符串. 譬如 ``123''、``abc''、``# 1''、...
[ ^] 限制字符串必须出现于行首. (用法见下例)
[ $] 限制字符串必须出现于行末.
[例如 :] Regexp `` ^The'' 用以表示所有出现于行首的字符串``The''. Regexp `` The$'' 用以表示所有出现于行末的字符串``The''. Regexp `` ^The$'' 则用以表示一个仅含字符串``The''的数据列. Regexp `` ^$'' 表示一个空白的数据列(行首与行尾之间未存在任一字符).
[ \] 将特殊字符还原成字面意义的字符. Regular Expression 中 特殊字符 将被解释成特定的意义. 若要表示特殊字符的字面(literal meaning) 意义时, 在 特殊字符之前加上 ``\'' 即可.
[例如 :] 使用 Regular Expression 来表示字符串``a.out''时, 不可写成 Regexp `` a.out''. 因为`` .''在 Regular Expression 中是特殊字符, 表示任一字符.
可合乎(match) Regexp `` a.out'' 的字符串将不只 ``a.out'' 一个; 字符串``a2out'',``a3out'', ``aaout''... 都合于 Regexp `` a.out''.
正确的表示法应为 : Regexp `` a\.out''
`` \'' 在 Regular Expression 中的另一个意 义是当成 Escape character.
[例如 :] `` \t'' 用以表示 tab. `` \n'' 表示换行符号.
[...] 『字符集合』, 用以表示两中括号间 所有的字符当中的任一个.
[例如 : ] Regexp `` [123]'' 可用以表示字符 ``1''、``2'' 或 ``3''. Regexp `` [Tt]'' 可用以表示字符 ``T'' 或 ``t''. 所以, Regexp " [Tt]he" 表示字符串 "The" 或 "the". (注意 : 一个字符集合仅代表``一个''字符.)
使用时, 需留心字符集合 [ ] 内不可随意留空白.
例如 : Regexp `` [ Tt ]'' 中括号内有空格符, 故除了可用 以表示字符``T''或``t''", 也可代表一个 `` ''(空格符).
- 字符集合中可使用 `` -'' 来指定字符的区间, 其用法如下:
Regexp `` [0-9]'' 等于 Regexp `` [0123456789]'' 用以表示任意 "一个" 阿拉伯数字. 同理 Regexp `` [A-Z]'' 用以表示任意 "一个" 大写英文字母.
但应留心 :
Regexp " [0-9a-z]" 并不等于 Regexp " [0-9][a-z]"; 前者表示一个字符(阿拉伯数字或小写英文字母), 后者表示二个字符.
Regexp " [-9]" 或 " [9-]" 仅用以代表字符 ``9''或 ``-''.
[ [\^{}... ]] 使用 [\^{...]} 产生字符集合的补集(complement set). 其用法如下 :
Regexp `` [^M]'' 用以表示除字符``M''外的``一个''任意字符
字符集合 `` [Tt]''表示字符 ``T'' 或 ``t''. 若要指定 ``T'' 或 ``t'' 之外的任一个字符, 可用Regexp `` [^Tt]'' 表示.
Regexp `` [^a-zA-Z]''表示英文字母之外的任一个字符.
需留心 `` ^''之位置; `` ^'' 必须紧接于 `` ['' 之后, 才代表字符集合的补集.
[例如 :] Regexp `` [0-9^]'' 表示一个阿拉伯数字或字符 `` ^'', 并非代表阿伯数字外的任意字符.
* 用以形容其前的字符或字符集合可重复任意次数的特殊字符.
`` *'' 形容它前方之字符(或字符集合)可出现 1 次或多次, 或不出现. 例如 :
Regexp ``ab*'' 中, `` *'' 形容它前方的字符 ``b'' 可出现 1 次或多次, 或不出现. 所以, Regexp ``ab*'' 可表示字符串 ``a''、``ab''、``abb''、 ``abbb''、...
Regexp `` T[0-9]*\.c'' 中, 使用 `` *'' 形容其前的字符集合 `` [0-9]''(一个阿拉伯数字)出现的次数 : 可为 0 次或多次.
故 Regexp `` T[0-9]*\.c''可用以表示 ``T.c''、``T0.c''、 ``T1.c''、``T2.c''、...、``T9.c''、``T00.c''、``T01.c''、``T02.c''、...、 ``T09.c''、``T10.c''、...``T99.c''、``T000.c''、...
[ \<] `` \< Regexp'' 表示一个出现于"前缀"且又合于(match)该 Regexp 的字符串 (用法见下例).
[ \>] ``Regexp \>'' 表示一个出现于"字末"且又合于(match)该 Regexp 的字符串.
这里所谓的``字(word)''系指被 tab、逗点、句点或空格符(space) 所分隔开的字符串.
[例如 :]
资料 ``One is red, and the other is white.'' 中 字符串 ``One'', ``is'', ``red'', ``and'', ``the'', ``other'', ``is'', ``white'' 便是所谓的 "字(word)". 而该资料列中,
合于 Regexp ``[Tt]he''的字符串如下(粗体字标示)
``One is red, and the other is white.''
合于 Regexp `` \<[Tt]he\>''却仅有(粗体字标示)
``One is red, and the other is white.''
因同时使用`` \<''及`` \>'' 限制合于 Regexp `` [Tt]he''的字符串, 必须紧接于前缀及字尾之间; 故 ``other''中的子字符串 ``the''并不合于这个 Regular Expression.
[注 :] \<, \> 这二个特殊字符, 并不是很通用. 请参考 Appendix A 中的附表.
\( ... )\ 于 Regular Expression 中使用 `` \(''``{ \)}''来括住一部分的 Regular Expression; 其后可用 `` \1'''来表示第一次被`` \('' `` \)'' 括住的部份. 若 Regular Expression 中使用了数次`` \('' `` \)'' 来括住不同的部分, 则依次使用 ``\1'', `` \2'', `` \3'' ,...(最多可用到 `` \9'')来 表示之前括住的 Regular Expression. 其用法如下 :
[用法一.]
例如: 欲表示像``aa'',``bb'',``cc'',...``zz'' 等字符串.
使用 Regexp `` [a-z]''则表示任一个小写的英文字母.
使用 Regexp `` [a-z][a-z]''则表示二个任意的小写英文字母. 它除表示 ``aa'',``bb'',``cc'',...``zz''等字符串外, 也可表示``ab'', ``ac'',``ad'',...等字符串(这不是题意所要求的字符串).
这时可以`` \('' `` \)'' 来括住第一个 `` [a-z]'' (Regular Expression 解译的程序, 会暂时记录实际找寻 到的英文字母). 之后, 便可以 Regexp ``\1'' 来指定适才被记 录下的英文字母即为所要找寻字符串的第二个字符. 故正确的表示法如下 :
Regexp `` \([a-z]\)\1''
例如 : 欲表示像 ``789w987'', ``abcwcba'', ``theweht'',....等具对称性 的字符串.(该字符串的特征是 ``w''之前后三个字符相互对称) 该类字符串的表示法如 下 :
Regexp `` \(.\)\(.\)\(.\)w\3\2\1" Regexp中`` .''表示任意一个字符. 因字符``w''之前出现的三个字符并无 任何限制, 故可用 `` ...''表之. 但每个`` .''分别用 `` \('',`` \)'' 括住, 之后便可使用 `` \1'', `` \2'', `` \3'' 分别代表将来实际匹配到的前三个字符.
用法二. 进行字符串找寻并置换(Replace)时, 若将被置入的新字符串不是一个固定的字符串, 与被找到的原字符串有关时(见下例说明). 此时, 可先以 \( \)来括住一部分的Regular Expression; 再于将被新置入的字符串中使用`` \1'', `` \2'',... 来表示当时被找到的字符串(或其子字符串).
例 : 欲找出档案中具有 ``prog12.c'', ``prog9.c'', ``prog832.c'',... 等式样的字符串, 并将其置换成(以上列三个字符串为例) ``[ note 12]'', ``[ note 9]'', ``[ note 832]''. 在这例子中, 因事先不知道所找寻到的字符串(prog数字.c)中的 数字 为何, 故无法事先决定应换成什么新字符串. 合于本例所要找寻的字符串其 Regular Expression 为 :
Regexp `` prog[0-9][0-9]*\.c'' 上式中 `` [0-9][0-9]*'' 表一位或一位以上的阿拉伯数字, 因 执行前并不知道该部分实际会匹配什么数值, 故找到的字符串将来应置换 成什么, 事前无法指定. 这情况, 也可用`` \('',`` \)'' 来括住 `` [0-9][0-9]* '', 在置换的新字符串中再以 \1 表示找寻时实际匹配到的数字.
读者可编辑一数据文件, 再以sed执行下列命令, 观察其执行结果.
$sed -e 's/ prog\([0-9][0-9]*\)\.c/[ note \1]/g' 资料文件名
\{ 数字, 数字\} 一种于 Regular Expression 中形容其前的字符或字符 集合出现次数的表示法. 其型态与用法如下 :
\{下限数字, 上限数字\}
例如 : Regexp "[0-9]\{2,4\}"用以表示2到4位的阿拉伯数字.
{ 数字}
例如 : Regexp `` ax\{99\}'' 用以表示一个 ``a'' 之后接上99个 ``x'' 所组成的字符串.
\{下限数字, \} 例如 : Regexp `` ax\{2,\}'' 用以表示一个 ``a'' 之后接上2个或更多的 ``x''所组成的字符串.
+ 形容其前的字符或字符集合出现一次或一次以上(注三).
例如 : Regexp `` [0-9]+'' 用以表示一位或一位以上的数字.
? 形容其前的字符或字符集合可出现一次或不出现(注三).
[例如 :] Regexp ``[+-]?[0-9]+'' 表示数字(一位以上)之前可出现一个正负号 或不出现正负号.
[ (...)] 用以括住一群字符,且将之视成一个group(见下面说明)(注三)
例如 :
Regexp `` 12+'' 表示字符串 "12","122","1222","12222",...
Regexp `` (12)+'' 表示字符串 "12","1212","1212","1212"....
上式中字符串 ``12''以( )括住,整个视为一个group, 故被重复符号``+'' 所形容的是``12''而非 ``2'', 重复出现的也是 ``12''.
| 表示逻辑上的 "or" (注三)
例如 : Regexp `` Oranges?|apples?|water'' 可用以表示字符串``Orange'', ``Oranges''
或 ``apple'', ``apples''
或 ``water''
注三 : 上列 + , ?, (...), | 等用法, 为 Extended Regular Expression 中新增列的用法. awk 及 egrep 中所使用的 Regular Expression 即为 Extended Regular Expression. 但 vi, sed, grep,...等软件中并无这些用法.
& ``&''并非 Regular Expression 中的特殊字符. 但以 Regular Expression 进行字符串找寻置换(Replace)时, 常会用到 ``\&''. \ 在许多 Unix tool 中, 当 ``\&''出现在『将被置入的新字符串』时, 它用以表示 ``实际被找到合于所指定的 Regular Expression 的字符串'' (见下例说明)
例如 : 找出档案中所有合乎 Regexp ``a[0-9]*\.c'' 的字符串, 并在其前后加上小 括号.依题意要求, 档案中所有如 ``a12.c'', ``a932.c'', ``a45.c'' ,...等字符串都应置换为 ``(a12.c)'', ``(a932.c)'', ``(a45.c)'',.. . . 遇到这情况,可令『将被置入的新字符串』为 `` (&)'' 此时, ``&''便是用来表示实际上被找到合于 Regexp ``a[0-9]*\.c'' 的字符串.
下列是使用 UNIX 上不同的工具, 来处理本例要求的字符串置换.
vi 以 vi 编辑该档案,并在 vi 命令输入模式下输入
: s/a[0-9]*\.c/(&)/g
sed 执行如下命令 ( $ 表 Shell 命令列的提示符号 )
$ sed -e 's/a[0-9]*\.c/ (&)/g' 数据文件名称
awk 执行如下命令 ( $ 表 Shell 命令列的提示符号 )
$ awk '{ gsub(/a[0-9]*\.c/, "(&)"); print }' 数据文件名称
--------------------------------------------------------------------------------
Note 2:
上列字符在 Regular Expression 中代表特殊意义, 称之为 特殊字符. 但 Unix 中不同的指令对 Regular Expression 的解释能力不尽相同, 故对特殊字符也有不同的认定. 请参考尾页附表.
使用 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), 如此才可获得正确的结果.
范 例
本节列出数个 Regular Expression 的应用简例, 供读者参考. 由这些范例中, 读者可一窥实际应用时, 如何藉由 Regular Expression 来表达字符串, 来完成 某些目的. 至于各指令像 vi, sed, awk, ...中之语法说明已非本文所能涵盖, 读者请自行参考相关书籍.
a. 将档案中所有字符串 ``Regular Expression'' 或 ``Regular expression'' 换成 ``Regexp''.
以 vi 编辑该档案, 并在 vi 命令输入模式下执行 :
:1,$ s/ Regular [Ee]xpression/Regexp/g
b. 将档案中所有具 ``ddd-dddd'' 特征的字符串(d表阿拉伯数字)之前插入字符串 ``Tel :''.
以 vi 编辑该档案, 并在, vi 命令输入模式下执行 :
:1,$ s/[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]/Tel:&/g
说明 : `` &'' 代表执行时实际合于该 Regular Expression 的字符串.
c. 将档案中所有俱有 `` program数字.c'' 特征的字符串换成 ``test数字.f''.
解法 : 以vi编辑该档案, 并在vi命令输入mode下执行 :
:1,$ s/ program\([0-9][0-9]**\)\.c/test\1.f/g
说明 : Regexp `` [0-9][0-9]*'' 表示一位或一位以上的阿拉伯数字. `` \1'' 被找到的字符串中的数值部分. (被\(...\)括住的部分).
d. 将档案中第5-13行, 整个区域往右移5格(空格符).
解法 : 以vi编辑该档案, 并在vi命令输入mode下执行
:5,13 s/ .*/ &/
说明 : Regexp `` .*" 用以 match 整个数据列(之后以&表之). 并用 `` &''(5个空白及原先之资料列)取代该列资料.
e. 将上例档案中的数据列(5-13行), 往左移回3格.
解法 : 以vi编辑该档案, 并在vi命令输入mode下执行
:5,13 s/ \^ ///
说明 : 将行首的三个空格符换成空字符串.
f. 试从一个档案的全名中分离出其路径及文件名.
解法 : 编辑如下的script并取名为 ``sepname''
awk '
BEGIN {
match( ARGV[1], /.*\//)
print "path=", substr(ARGV[1], 1 ,RLENGTH-1)
print "name=", name = substr(ARGV[1], RLENGTH+1 )
} ' $1 }
执行 $ sepname /usr/local/bin/xdvi
结果印出 path= /usr/local/bin
name= xdvi
g. 将档案中以``From''或``from''为行首的数据打印出
执行 $ awk '/^[Ff]rom/ ' 数据文件文件名
h. 去除挡案中空白行
执行 $ sed -e "/ ^$/d"
后 语
虽然 Regular Expression 仅是一种字符串的表示方式, 但从上列的范例 中不难窥出, 配合接受 Regular Expression 的指令或工具, 其应用面 将远超出找寻字符串及置换字符串. 使用 Regular Expression 不仅扩大了 字符串的表达能力, 让使用者很容易进行字符串判断; 使数据处理的过程便 为更为迅速便利.
Appendix : Test using Regular Expression in various environments
HP-UX
下表列出测试 HP-UX Release 9.0 中常见的工具对 Regular Expression 中各种特殊字符的接受能力.
ex vi sed awk grep egrep 说明
. * * * * * *
* * * * * * *
^ * * * * * *
$ * * * * * *
\ * * * * * *
[ ] * * * * * *
\( \)与\1...\9 合用(一) * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * * * - - 把\1...\9用于欲置换的新字符串中
{重复次数} * *
{下限,上限} * *
{下限, } * *
\< \> * *
+ * *
? * *
| * *
( ) * *
\ * * * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
Sun Solaris 2.X
下表列出测试 Sun Solaris 2.x 中常见的工具对 Regular Expression 中各种特殊字符的接受能力
ex vi sed awk grep egrep 说明
. * * * * * *
* * * * * * *
^ * * * * * *
$ * * * * * *
\ * * * * * *
[ ] * * * * * *
\( \)与\1...\9 合用(一) * * * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * * * - - 把\1...\9用于欲置换的新字符串中
{重复次数} * * * *
{下限,上限} * * * *
{下限, } * * * *
\< \> * * * *
+ * *
? * *
| * *
( ) * *
\ * * * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
AIX 3.2.5
下表列出测试 AIX 3.2.5 中常见的工具对 Regular Expression 中各种特殊字符的接受能力.
ex vi sed awk grep egrep 说明
. * * * * * *
* * * * * * *
^ * * * * * *
$ * * * * * *
\ * * * * * *
[ ] * * * * * *
\( \)与\1...\9 合用(一) * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * * * - - 把\1...\9用于欲置换的新字符串中
{重复次数} * *
{下限,上限} * *
{下限, } * *
\< \> * *
+ * *
? * *
| * *
( ) * *
\ * * * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
GNU Tools
下表列出测试 GNU 所提供的工具对 Regular Expression 中各种特殊字符的接受能力.
sed awk grep -G egrep -E emacs 说明
. * * * * *
* * * * * *
^ * * * * *
$ * * * * *
\ * * * * *
[ ] * * * * *
\( \)与\1...\9 合用(一) * * 把\1...\9用于 Regular Expression 中
\( \)与\1...\9 合用(二) * - - * 把\1...\9用于欲置换的新字符串中
{重复次数} * *
{下限,上限} * *
{下限, } * *
\< \> * * * *
+ * * *
? * * *
| * *
( ) * *
\ * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
相关阅读 更多 +