RegExp 組

JavaScript 支援幾種型別的組,包括正規表示式,捕獲組非捕獲組預測。目前,沒有後備支援。

捕獲

有時,所需的匹配依賴於它的上下文。這意味著一個簡單的 RegExp 將過度查詢感興趣的 String 片段,因此解決方案是編寫一個捕獲組 (pattern)。捕獲的資料可以被引用為……

  • 字串替換 $n 其中 n 是第 n 個捕獲組(從 1 開始)
  • 回撥函式中的第 n 個引數
  • 如果 RegExp 未標記為 g,則返回 str.match 陣列中的**第 n + 1 項 **
  • 如果 RegExp 被標記為 gstr.match 會丟棄捕獲,請改用 re.exec

假設有一個字串,其中所有+標誌都需要用空格替換,但前提是它們遵循字母字元。這意味著一個簡單的匹配將包括該字母字元,它也將被刪除。捕獲它是解決方案,因為它意味著可以保留匹配的字母。

let str = "aa+b+cc+1+2",
    re = /([a-z])\+/g;

// String replacement
str.replace(re, '$1 '); // "aa b cc 1+2"
// Function replacement
str.replace(re, (m, $1) => $1 + ' '); // "aa b cc 1+2"

非捕獲

使用 (?:pattern) 表單,這些表單以類似的方式捕獲組,但它們不會在匹配後儲存組的內容。

如果捕獲的其他資料不想移動索引,但需要進行一些高階模式匹配(如 OR),它們會特別有用

let str = "aa+b+cc+1+2",
    re = /(?:\b|c)([a-z])\+/g;

str.replace(re, '$1 '); // "aa+b c 1+2"

展望

如果所需的匹配依賴於跟隨它的東西,而不是匹配它並捕獲它,則可以使用預測來測試它但不包括在匹配中。正向前瞻形式為 (?=pattern),負前瞻(表示式匹配僅在前瞻模式不匹配時才會出現)的形式為 (?!pattern)

let str = "aa+b+cc+1+2",
    re = /\+(?=[a-z])/g;

str.replace(re, ' '); // "aa b cc+1+2"