google code-beautifer

星期五, 6月 08, 2007

在Emacs 上用正規表達式(Regular Expression)

前言

我痛恨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)字元. 程式字元就是上面那些特殊符號,如
    `w'(文字字元), `-' for whitespace, `(',...等等 。詳情見GNU emacs 手冊的章節: The Syntax Table.
  • \Scode
  • 對應一個非程式字元


我這裡寫的有一點心虛,是因為emacs原來只針對英文設計,處理中文時,因為語文結構上的差異造成了功能定義變得不明確。不過基本上我目前用emacs 22 處理中英文的試驗結果,\b 跟 \w 對待中文字的確是如同英文一般。有意者可以參考gnu 出版的原文手冊。這裡是GNU emacs 手冊提到正規表達式的章節:
http://www.gnu.org/software/emacs/manual/emacs.html#Regexps

2 則留言:

匿名 提到...

第二點『^ 代表字串結尾』好像打錯了。好像是 $ 。

shelandy 提到...

是的, copy 時弄錯了,^ 打了兩次,謝謝指正。