RegExp 組
JavaScript 支援幾種型別的組,包括正規表示式,捕獲組,非捕獲組和預測。目前,沒有後備支援。
捕獲
有時,所需的匹配依賴於它的上下文。這意味著一個簡單的 RegExp 將過度查詢感興趣的 String 片段,因此解決方案是編寫一個捕獲組 (pattern)
。捕獲的資料可以被引用為……
- 字串替換
$n
其中n
是第 n 個捕獲組(從1
開始) - 回撥函式中的第 n 個引數
- 如果 RegExp 未標記為
g
,則返回str.match
陣列中的**第 n + 1 項 ** - 如果 RegExp 被標記為
g
,str.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"