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: 不分大小寫

Example

Thank You