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用于欲置换的新字符串中
{重复次数} * *
{下限,上限} * *
{下限, } * *
\< \> * * * *
+ * * *
? * * *
| * *
( ) * *
\ * * - -
* 表示该指令有解释这种特殊字符的能力.
- 表示未测试该项功能.
转自: