Regular Expression Pattern
What?
用來表示一段字串的樣式
When?
欲尋找特定樣式的片段時
Why?
判斷是否為郵遞區號(99999-9999)
來源: 忍者JavaScript開發技巧探秘第七章
Common
function isThisAZipCode(candidate) {
if (typeof candidate !== "string" || candidate.length != 10) return false;
for (var n = 0; n < candidate.length; n++) {
var c = candidate[n];
switch (n) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
if (c < "0" || c > "9") return false;
break;
case 5:
if (c != "-") return false;
break;
}
}
return true;
}
Regular Expressions
function isThisAZipCode(candidate){
return /^\d{5}-\d{4}$/.test(candidate);
}
Simple
完全符合的比對,像是/abc/就是比對abc串聯的字串。
Special
在模糊比對時使用正規表達式定義的特殊字元來表示樣式,例如/ab*c/中的*式正規表達式中的特殊字元,所以ac或abbc也會符合此比對條件。
Special
Characters
\
此符號後的一般字元變為特殊字元,特殊字元變為一般字元。
// 特殊字元變一般字元
var multia = /a*/; // 比對零到多個連續的a
var astar = /a\*/; // 比對a*
// 一般字元變特殊字元
var d = /d/; // 比對d
var digit = /\d/; // 比對所有數字字元
Character Sets
比對字元組中的其中一個字元,以[]中括號括住字元組,如果是連續的字元所組成也可以用-來省略中間的字元。
var cc = /[xyz]/; // 符合其中一個字元,x、y、z都符合
var ccto = /[x-z]/; // 符合其中一個字元,使用-省略中間的字串,x、y、z都符合
var ecc = /[^xyz]/; // 符合任一非括號中的字元,除了x、y、z都符合
Character Classes
有些常用的字元組已被正規表達式定義。
var dot = /./; // [^\n\r\u2028\u2029] 除了換行字元外的所有字元
var d = /\d/; // [0-9]
var D = /\D/; // [^0-9]
var w = /\w/; // [A-Za-z0-9_]
var W = /\W/; // [^A-Za-z0-9_]
var s = /\s/; // [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] 空白字元
var S = /\S/; // [^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
x|y
符合x或y其中一個字元。
var or1 = /a*|b/;
var or2 = /b|a*/;
or1.exec('b');
or2.exec('b');
邊界
對於條件開頭、結尾的限制。
var startA = /^A/; // 以A為開頭的輸入
var endA = /A$/; // 以A為結尾的輸入
var b = /\bm/; // \b為任一邊界字元,在moon中會找到m,本身不算在匹配結果中
var B = /\Bon/; // \B為任一非邊界字元,在moon中會找到on,本身不算在匹配結果中
重複出現
一個字元重複出現多次。
var nothingToMore = /x*/; // x重複出現零到多次,等於/x{0,}/
var oneToMore = /x+/; // x重複出現一到多次,等於/x{1,}/
var nothingToOne = /x?/; // x重複出現零到一次,等於/x{0,1}/
var five = /x{5}/ // x重複出現剛好五次
判斷式
var ifFollow = /x(?=y)/; // 如果x後面接y,則取得x作為結果
var ifNotFollow = /x(?!y)/; // 如果x後面沒有接y,則取得x作為結果
群組
以()括住的字串會放入群組資料中,像是*、?、+這種只會對前一個字元作用的功能,使用群組就可以對整個目標字串做處理。
捕捉
群組中的字串會被捕捉變成結果中的其中一個值。
回溯參照
在群組中的結果值會被記錄在\n(第n個群組結果),在比對字串中可以使用。
不捕捉
如果只是為了比對而做群組,不想攪亂結果及浪費效能,可以用(?:x)來排除捕捉動作。
Flags
- g: 搜尋完整的內容找出全部的結果
- m: 用^或$的效果在換行時也有用
- i: 不分大小寫