經過了前兩節的介紹,我想各位同學都能瞭解到正規式的威力是無遠弗屆的,但如何適切的發揮正規式的功能,就要看程式設計者的經驗和功力了。 下表整理出常用到的正規式,方便各位同學能進行快速尋找及應用。與通用式相關的方法可列表如下:
與通用式相關的方法 功能 re.exec(string) 從字串 string 抽取符合通用式 re 的子字串,並以字串陣列傳回 re.test(string) 以字串 string 比對通用式 re,並傳回比對結果(true 代表比對成功,false 代表比對失敗) string.search(re) 通用式 re 在某個字串 string 出現的位置 string.match(re) 從字串 string 抽取符合通用式 re 的子字串,並以字串陣列傳回,此功能和 re.exec(string) 相同 string.replace(re, newStr) 將字串 string 符合通用式 re 的部分,代換為 newStr 在下列的表格中,我們使用幾個簡單的範例來對通用式的應用做較完整的說明:
通用式 說明及範例 比對不成立之字串 /a/ 含字母 "a" 的字串,例如 "ab", "bac", "cba" "xyz" /a./ 含字母 "a" 以及其後任一個字元的字串,例如 "ab", "bac"(若要比對.,請使用 \.) "a", "ba" /^xy/ 以 "xy" 開始的字串,例如 "xyz", "xyab"(若要比對 ^,請使用 \^) "axy", "bxy" /xy$/ 以 "xy" 結尾的字串,例如 "axy", "abxy"以 "xy" 結尾的字串,例如 "axy", "abxy" (若要比對 $,請使用 \$) "xya", "xyb" /[13579]/ 包含 "1" 或 "3" 或 "5" 或 "7" 或 "9" 的字串,例如:"a3b", "1xy" "y2k" /[0-9]/ 含數字之字串 不含數字之字串 /[a-z0-9]/ 含數字或小寫字母之字串 不含數字及小寫字母之字串 /[a-zA-Z0-9]/ 含數字或字母之字串 不含數字及字母之字串 /b[aeiou]t/ "bat", "bet", "bit", "bot", "but" "bxt", "bzt" /[^0-9]/ 不含數字之字串(若要比對 ^,請使用 \^) 含數字之字串 /[^aeiouAEIOU]/ 不含母音之字串(若要比對 ^,請使用 \^) 含母音之字串 /[^\^]/ 不含 "^" 之字串,例如 "xyz", "abc" "xy^", "a^bc" 請注意在上表中,"^" 在兩條斜線中,代表一個字串的開始位置,因此 /^xy/ 代表以 "xy" 開始的字串。 同理,"$" 在兩條斜線中,代表一個字串的結束位置,因此 /xy$/ 代表以 "xy" 結束的字串。 但是如果將 "^" 放在兩個方括弧中,就代表「否定」,因此 [^aeiouAEIOU] 代表不含母音之字元。
另外,若要避掉特殊字元的特殊意義,就要在此字元前加上 "\",例如上表中的最後一列,"^" 在方括弧裡面是代表「否定」,因此若要在方括弧裡面比對 "^",就要使用 "\^",所以「不含 "^" 之字串」的通用式就是 "[^\^]"。
以 RegExp(pattern, flag) 的方式來建立通用式物件時,若 pattern 包含以反斜線開頭的特殊字元(例如 \d、\w、\s 等)時,我們必須再加上一個反斜線來保留其特殊意義。例如:
re = /\d+\s\w+/g 以 RegExp 為主的等效表示法為:re = new RegExp("\\d+\\s\\w+", "g"); 有些通用式會常被用到,因此已被定義為特定字元,以簡化整體通用式,這些字元可列表說明如下:
通用表示法的特定字元 說明 等效的通用表示法 \d 數字 [0-9] \D 非數字 [^0-9] \w 數字、字母、底線 [a-zA-Z0-9_] \W 非 \w [^a-zA-Z0-9_] \s 空白字元 [ \r\t\n\f] \S 非空白字元 [^ \r\t\n\f] 此外,我們可定義字元的重複次數,如下:
通用表示法 說明 /a?/ 零或一個 a(若要比對? 字元,請使用 \?) /a+/ 一或多個 a(若要比對+ 字元,請使用 \+) /a*/ 零或多個 a(若要比對* 字元,請使用 \*) /a{4}/ 四個 a /a{5,10}/ 五至十個 a /a{5,}/ 至少五個 a /a{,3}/ 至多三個 a /a.{5}b/ a 和 b中間夾五個(非換行)字元 相信各位現在已經可以體會到通用表示式的威力了!
以下再對通用式,進行比較完整的列表與說明:
字元 說明 簡單範例 \ 避開特殊字元 /A\*/ 可用於比對 "A*",其中 * 是一個特殊字元,為避開其特殊意義,所以必須加上 "\" ^ 比對輸入列的起始位置 /^A/ 可比對 "Abcd" 中的 "A",但不可比對 "aAb" $ 比對輸入列的結束位置 /A$/ 可比對 "bcdA" 中的 "A",但不可比對 "aAb" * 比對前一個字元零次或更多次 /bo*/ 可比對 "Good boook" 中的 "booo",亦可比對 "Good bk" 中的 "b" + 比對前一個字元一次或更多次,等效於 {1,} /a+/ 可比對 "caaandy" 中的 "aaa",但不可比對 "cndy" ? 比對前一個字元零次或一次 /e?l/ 可比對 "angel" 中的 "el",也可以比對 "angle" 中的 "l" . 比對任何一個字元(但換行符號不算) /.n/ 可比對 "nay, an apple is on the tree" 中的 "an" 和 "on",但不可比對 "nay" (x) 比對 x 並將符合的部分存入一個變數 /(a*) and (b*)/ 可比對 "aaa and bb" 中的 "aaa" 和 "bb",並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。 x|y 比對 x 或 y /a+|b+/g 可比對 "aaa k bb" 中的 "aaa" 和 "bb" {n} 比對前一個字元 n 次,n 為一個正整數 /a{3}/ 可比對 "lllaaalaa" 其中的 "aaa",但不可比對 "aa" {n,} 比對前一個字元至少 n 次,n 為一個正整數 /a{3,}/ 可比對 "aa aaa aaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa" {n,m} 比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數 /a{3,4}/ 可比對 "aa aaa aaaa aaaaa" 其中的 "aaa" 及 "aaaa",但不可比對 "aa" 及 "aaaaa" [xyz] 比對中括弧內的任一個字元 /[ecm]/ 可比對 "welcome" 中的 "e" 或 "c" 或 "m" [^xyz] 比對不在中括弧內出現的任一個字元 /[^ecm]/ 可比對 "welcome" 中的 "w"、"l"、"o",可見出其與 [xyz] 功能相反。(同時請同學也注意 /^/ 與 [^] 之間功能的不同。) [\b] 比對退位字元(Backspace character) 可以比對一個 backspace ,也請注意 [\b] 與 \b 之間的差別 \b 比對英文字的邊界,例如空格 例如 /\bn\w/ 可以比對 "noonday" 中的 'no' ;
/\wy\b/ 可比對 "possibly yesterday." 中的 'ly'\B 比對非「英文字的邊界」 例如, /\w\Bn/ 可以比對 "noonday" 中的 'on' ,
另外 /y\B\w/ 可以比對 "possibly yesterday." 中的 'ye'\cX 比對控制字元(Control character),其中 X 是一個控制字元 /\cM/ 可以比對 一個字串中的 control-M \d 比對任一個數字,等效於 [0-9] /[\d]/ 可比對 由 "0" 至 "9" 的任一數字 但其餘如字母等就不可比對 \D 比對任一個非數字,等效於 [^0-9] /[\D]/ 可比對 "w" "a"... 但不可比對如 "7" "1" 等數字 \f 比對 form-feed 若是在文字中有發生 "換頁" 的行為 則可以比對成功 \n 比對換行符號 若是在文字中有發生 "換行" 的行為 則可以比對成功 \r 比對 carriage return \s 比對任一個空白字元(White space character),等效於 [ \f\n\r\t\v] /\s\w*/ 可比對 "A b" 中的 "b" \S 比對任一個非空白字元,等效於 [^ \f\n\r\t\v] /\S/\w* 可比對 "A b" 中的 "A" \t 比對定位字元(Tab) \v 比對垂直定位字元(Vertical tab) \w 比對數字字母字元(Alphanumerical characters)或底線字母("_"),等效於 [A-Za-z0-9_] /\w/ 可比對 ".A _!9" 中的 "A"、"_"、"9"。 \W 比對非「數字字母字元或底線字母」,等效於 [^A-Za-z0-9_] /\W/ 可比對 ".A _!9" 中的 "."、" "、"!",可見其功能與 /\w/ 恰好相反。 \ooctal 比對八進位,其中octal是八進位數目 /\oocetal123/ 可比對 與 八進位的ASCII中 "123" 所相對應的字元值。 \xhex 比對十六進位,其中hex是十六進位數目 /\xhex38/ 可比對 與 16進位的ASCII中 "38" 所相對應的字元。
JavaScript 程式設計與應用:用於網頁用戶端