我痛恨Computer Science 一堆老師的位子都被有辦法的外系背景的人佔走,這些人又不懂電腦實務,結果搞出來的電腦教育七零八落。變成惡性循環。這檔事中外皆然,但臺灣尤烈。
假如離散數學學過了正規表達式(Regular expression)跟automata ,就一廂情願以為是可以直接在compiler 上套用non-deterministic的觀念,那就會死的很慘。就算修過compiler ,知道了要用deterministic的觀念,要以為在unix 上的find/grep/awk/表達檔案 wild card 上也可直接套用正規表達式(regular expression) 觀念來用,保證也死的很慘。因為解釋方式不一樣。現在發現,就算知道了前述 unix 系統上的工具如何正確的用正規表達式,在Emacs 下用法還是不太一樣,要小心。但是一但會用,真是如虎添翼。
在eamcs裡起動正規表達式的取代是用
ctrl-alt-%
先輸入搜尋字串正規表達式模版,按enter 後,再輸入取代的字串,一般基本的擴充正規表達式(extended Regular Expression)大多可以用
要輸入控制字元如 Crtl-J (也就是unix 上的換行控制字元),用按Ctrl-Q 後再按j 也就是先按 Ctrl-Q 後再按該字元。這讓Emacs 可以搜尋跟取代跨行的文字。強!
以下是詳細列表
- ^ 代表字串開頭
- $ 代表字串結尾
- . 任何字元
- * 重複前面sub-RE任意次, 跟unix 檔案不一樣的是,這跟數學上的RE 用法接近,前面要接一個sub-RE,sub-RE可以是字元RE或字串RE
- + 同*用法,但是是出現一次以上
- ? 同*用法,但是是出現零或一次
- [ ... ] 把 []裡的字元當成集合元素來用,任選其中之一
- [^ ... ] 把 []裡的字元當成集合元素來用,任選這個集合的補集合裡其中元素之一
- \ 逃逸字元,把上述特殊符號當一般字元時要先加\
- \| 或: 前後兩個sub-RE 任選其中之一 ,比如說 腦殘 \| 丁丁
- \( ... \) 連接或群化:把\( \) 裡的平行元素(用\| 分隔)或把sub-RE 元素連成一個大的序列RE,簡而言之就是數學裡的 (,),按照其出現的順序,這些被\( ... \) 形成的RE 可以被後面再次呼叫引用,如\(腦殘 \| 丁丁 \)
- \數字 去引用前面被\( ... \) 形成的RE,如 \2 是引用前面出現過的第二個\( ... \)的正規表達式模組
- \` 在檔案(正確說法其實應該是buffer)起頭的空字串
- \' 在檔案(正確說法其實應該是buffer)末尾的空字串
- \b (英)文字正前或正後方的空字串 `\bfoo\b' 對應任何單獨存在的 `foo' 字串(以sub-string 型式出現的如food就不算).
- \B 不在(英)文字正前或正後方的空字串
- \< 在(英)文字正前方的空字串
- \> 在(英)文字正後方的空字串
- \w 對應一個文字字元(對英文而言,即abcd,...不包含空白之類的分隔字元)
- \W 對應一個非字元字元,也就是\w 的補集
- \scode 對應任何一個程式(code)字元. 程式字元就是上面那些特殊符號,如
- \Scode 對應一個非程式字元
`w'(文字字元), `-' for whitespace, `(',...等等 。詳情見GNU emacs 手冊的章節: The Syntax Table.
我這裡寫的有一點心虛,是因為emacs原來只針對英文設計,處理中文時,因為語文結構上的差異造成了功能定義變得不明確。不過基本上我目前用emacs 22 處理中英文的試驗結果,\b 跟 \w 對待中文字的確是如同英文一般。有意者可以參考gnu 出版的原文手冊。這裡是GNU emacs 手冊提到正規表達式的章節:
http://www.gnu.org/software/emacs/manual/emacs.html#Regexps
2 則留言:
第二點『^ 代表字串結尾』好像打錯了。好像是 $ 。
是的, copy 時弄錯了,^ 打了兩次,謝謝指正。
張貼留言