1. 程式人生 > >轉貼 Regular Expression 簡介(正則表示式)

轉貼 Regular Expression 簡介(正則表示式)

引用: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,...等軟體中並無這些用法.(grep 加上-E選項後可以用) 
& ``&''並非 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用於欲置換的新字串中
{重複次數}        *                *                       
{下限,上限}        *                *                       
{下限, }        *                *                       
\< \>        *                *        *        *       
+                *                *        *       
?                *                *        *       
|                *                *               
( )                *                *               
\        *        *        -        -               

* 表示該指令有解釋這種特殊字元的能力.  
- 表示未測試該項功能.