正規表示法教學
20140704(五) 14:00~16:00 「RegExp 研習」 陳爽
參考網頁 zh.wikipedia.org/wiki/正则表达式
英文 Regular Expression,或 regex、regexp 等,簡稱 RE (本文此後都用 RE)。
RE 中文譯為 正規表示式,或 正則表達式、正規表示法、常規表示法 等。
RE 可準確描述字串樣式(pattern),用來在文件中匹配符合指定規則的字串。
RE 廣泛用於許多文字編輯器 (例如這次研習我們用的 emeditor) ,以 檢索 或 替換某些符合些指定樣式之文字。
準確匹配 之 RE 例句 /Handel/ (本文的 RE 例句 都放在兩個斜線符號之間)用來 在文件中 檢索 Handel
任意匹配 之 RE 例句 /H.ndel/ (含 句點) 在文件中 可檢索到 Handel、Händel。
選擇匹配 之 RE 例句 /H(a|ä|ae)ndel/ (含 左右圓括號 及 | 豎線符號)在文件中 可檢索到 Handel、Händel 和 Haendel 這三個字串。括號外文字,必須準確匹配;括號內豎線符號隔開的文字,可以選擇匹配。
指定匹配次數 之 RE 例句 /o{2}/ (含 左右大括號) 用來 檢索 oo。
RE 例句 /o{2,3}/ (含 左右大括號 及 逗號) 用來 檢索 oo 和 ooo。
RE 例句中 {,3} (缺起始次數) 表示 最多匹配 3 次({,3} 有些系統不支援,要改為{0,3})。
RE 例句中 {2,} (缺迄止次數) 表示 最少匹配 2 次。
至少一次匹配 之 RE 例句 /goo+gle/ (含 加號,等於 {1,}),用來 在文件中 檢索 google、gooogle、goooogle、... 等。
任意次數匹配 之 RE 例句 /0*42/ (含 星號,等於 {0,}),用來 在文件中 檢索 42、042、0042、00042、... 等。
最多一次匹配 之 RE 例句 /colou?r/ (含 問號,等於 {,1}) 用來 檢索color 和 colour。
RE 例句 /(grand)?father/ (含 左右圓括號 及 問號) 用來 檢索father 和 grandfather。
^ 表示 列首,例如 ^1 會找到數字1開頭的列。
$ 表示 列尾,例如 。$ 會找到句點結尾的列。
最少匹配 ?。當問號字符緊跟在任何次數匹配字符(*,+,?,{n},{n,},{n,m})後面時,匹配模式變為非貪婪,儘可能少匹配所搜尋的字串。而預設的貪婪模式則儘可能多匹配所搜尋字串。例如,對字串 「goo, koo, coo, go, gooo, goooo,roo, 」,/g.+?,/ 將找到「goo, go, gooo, goooo,」,而 /g.+,/ 將找到全部的字串,即最大批配。
特殊字符 \ 將下一個字符標記為一個特殊字符、或一個原義字符、或一個向後參照、或一個八進制轉義符。例如,/n/ 匹配字符 n,/\n/ 匹配一個換行符,/\\/ 匹配到字符 \,而 /\(/ 則匹配到左圓括號。
\xnn 十六進制碼 的 ASCII字符。例如,/\x41/ 匹配 A。
\x{nnnn} 十六進制碼 的 中文字符。例如,/\x{4e00}/ 匹配「一」。
字符集合(character class)[xyz]。匹配所到中括號內包含的任意字符。例如,/[abc]/ 匹配到 plain 中的 a。可含特殊字符如星號、加號、各種括弧等,但僅反斜線 \ 保持特殊含義,用為前述轉義字符。字串中間表示字符範圍描述;如果出現在首位則僅作為普通字符。
ASCII 字符集合匹配 之 RE 例句 /[\x00-\x7f]/。
中文字符集合 (unicode 4e00 ~ 9fa5) 匹配 之 RE 例句 /[\x{4e00}-\x{9fa5}]/。
排除字符集合 [^xyz]。字符 ^ 出現在中括號首位,則不匹配其中的字符。例如,/[^。]$/ 將會找到行尾不是句號結束的行。
[^a-z] 排除字符範圍。匹配任何不在指定範圍內的任意字符。例如,/[^a-z]/可以匹配任何不在/a/到/z/範圍內的任意字符。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,/er\b/可以匹配 never 中的 er,但不能匹配 verb 中的 er。
\B 匹配非單詞邊界。/er\B/能匹配 verb 中的 er,但不能匹配 never 中的 er。
\d 匹配一個數位字符。等於 [0-9]。
\D 匹配一個非數位字符。等於 [^0-9]。
\n 匹配一個換行。等於 \x0a。
\r 匹配一個 Enter 符。等於 \x0d。
\t 匹配一個跳格符。等於 \x09。
\s 匹配廣義空白字符,包括空格、跳格、換頁符等等。等於 [ \t](中間要輸入空格與跳格符號)。
\S 匹配任何非空白字符。等於 [^ \t]。
\w 匹配包括底線的任何單詞所用字符。等於 [A-Za-z0-9_]。
\W 匹配任何非單詞字符。等於 [^A-Za-z0-9_]。
匹配獲取字串的 RE 例句 /(..)\1/ 可匹配 「一個一個」 的雙字重覆詞。
\i 如果 i 為 1 到 9 中的任意數字,且之前至少有 i 個用圓括號獲取字串的 RE,則 \i 代表第 i 個圓括號獲取的字串。例句 /(.)\1(.)\2/ 可匹配 「快快樂樂」。