正則表達式中圓括號 () 核心作用是 **分組** 與 **捕獲**:將子模式作為整體應用量詞,並保存匹配文本供後續引用。本文通過 JavaScript replace() 回調函數參數機制,深度解析分組捕獲順序、嵌套規則、非捕獲組、反向引用及與方括號 [] 的區別。
var date = '2015-8-7';
var re = /(\d+)(-)/g; // 兩個捕獲組:(\d+) 和 (-)
date.replace(re, function(a1, a2, a3) {
// a1: 整個匹配文本 (如 "2015-", "8-")
// a2: 第 1 組捕獲內容 (如 "2015", "8")
// a3: 第 2 組捕獲內容 (如 "-", "-")
// 更多分組依此類推 a4, a5...
// 最後兩個參數固定:匹配位置 offset、原字符串 string
});
\d+-)。\d+)。-)。
var a = date.replace(re, function(a1, a2, a3) {
return a2 + '.'; // 用第一組 (數字) + '.' 替換整個匹配
});
// 結果: "2015.8.7"
var a = date.replace(re, function(a1, a2, a3) {
return a1.substring(0, a1.length - 1) + '.'; // 去掉最後 '-' 加 '.'
});
// 結果: "2015.8.7"
((a)(b)) → 組1: (a)(b)、組2: (a)、組3: (b)。(?:...):不佔用編號,不保存匹配文本,僅用於分組應用量詞。(?:\d+)-(\d+) → 只有 1 個捕獲組。\1、\2... 引用前面捕獲組內容。(\w+)\s+\1 匹配重複單詞。$1、$2... (JS)、\1 (Python/其他)。| 特性 | 方括號 [] | 圓括號 () |
|---|---|---|
| 核心含義 | 字符類:匹配括號內**任一字符** | 分組:視為**整體**,可捕獲、可反向引用 |
| 量詞作用 | 作用於單字符:[ab]+ 匹配 a/b 序列 | 作用於整個子模式:(ab)+ 匹配 ababab |
| 捕獲 | 不捕獲 | 捕獲(除非 (?:)) |
| 範例 | [0-9]、[a-zA-Z]、[^abc] (排除) | (\d{4})-(\d{2})、(?:non-capture) |
{n}:精確 n 次{n,}:至少 n 次{n,m}:n 到 m 次圓括號是正則**結構化、可復用、可引用**的關鍵。掌握 **捕獲組編號、回調參數映射、非捕獲組、反向引用、與 []/{} 區別**,能寫出精準、高效、可維護的正則。調試時善用 console.log 回調參數,所見即所得。