2013年4月24日 星期三

[JS]正規表示法(Regular expressions)


JavaScript 的正規式(Regular expressions)是一個內建的物件,函數 RegExp,宣告如下:

re = new RegExp("pattern", "flag")

re = /pattern/flag 


pattern 代表正規表示法來顯示的字串
flag 則是比對的方式。flag 的值有三種: 

                    g:全域比對(Global match
                    i:忽略大小寫(Ignore case
                    gi:全域比對並且忽略大小寫

正規式
說明及範例
比對不成立之字串
/a/
含字母 "a" 的字串,例如:"ab", "bac", "cba"
"xyz"
/a./
含字母 "a" 以及其後任一個字元的字串,例如:"ab", "bac"
"a", "ba"
/^xy/
"xy" 開始的字串,例如:"xyz", "xyab"
"axy", "bxy"
/xy$/
"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"

正規表示法的特定字元
說明
等效的正規表示法
\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
xy
比對 x  y
/a*b*/g 可比對 "aaa and bb" 中的 "aaa"  "bb"
(x)
此名為存入括號。
(abc) (def)  RegExp.$1 = "abc";  RegExp.$2 = "def";
(?:x)
計算符合 x,但是不存入結果陣列。
str = "Hello Wendy";  str.replace(/(?:e.).*(d.)/,'x');
RegExp.$1 = dy;  RegExp.$2 = ;
x(?=y)
符合的條件要加上 x 之後必須接y
str = "Hello Wendy";
str.replace(/e(?=l)/gi,'x');
Hxllo Wendy
x(?!y)
符合的條件要加上 x 之後不可接y
str = "Hello Wendy";
str.replace(/e(?!l)/gi, 'x' );
Hello Wxndy
x|y
符合 x  y 都可以。
str='Hello Wendy';
str.replace(/e(?=(l|n))/gi,'x');
str.replace(/(he|lo|dy)/gi,'12');
Hxllo Wxndy
12l12 Wen12
{n}
比對前一個字元 n 次,為一個正整數
/a{3}/ 可比對 "lllaaalaa" 其中的 "aaa",但不可比對 "aa"
{n,}
比對前一個字元至少 n 次,為一個正整數
/a{3,}/ 可比對 "aa aaa aaaa" 其中的 "aaa"  "aaaa",但不可比對 "aa"
{n,m}
比對前一個字元至少 n 次,至多次,m均為正整數
/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" 所相對應的字元。

注意事項:
RegExp(pattern, flag) 的方式來建立正規式物件時,若 pattern 包含以反斜線開頭
的特殊字元(例如 \d\w\s 等)時,我們必須再加上一個反斜線來保留其特殊意義。例如:

re = /\d+\s\w+/g

 RegExp 為主的等效表示法為:

re = new RegExp("\\d+\\s\\w+", "g");

另外網站上也提供線上測試正規法:


資料來源:

1 則留言: