目錄 | 組成 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 的元素 | 範 例