首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

正則表達式圓括號 () 分組捕獲與反向引用深度解析

     編輯:更多程式設計知識

正則表達式中圓括號 () 核心作用是 **分組** 與 **捕獲**:將子模式作為整體應用量詞,並保存匹配文本供後續引用。本文通過 JavaScript replace() 回調函數參數機制,深度解析分組捕獲順序、嵌套規則、非捕獲組、反向引用及與方括號 [] 的區別。

分組捕獲與 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
});

形象比喻:母親與兒子們

  • a1 (母親):整個正則匹配的文本(\d+-)。
  • a2 (大兒子):左側第一個括號捕獲(\d+)。
  • a3 (小兒子):左側第二個括號捕獲(-)。
  • 每個兒子繼承母親部分基因(子串)。

實戰:將 2015-8-7 轉為 2015.8.7

方法一:操作兒子 (分組)


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"

分組編號規則

  1. **按左括號 ( 出現順序編號**,從 1 開始。
  2. **嵌套組**:外層括號先編號,內層後編號。((a)(b)) → 組1: (a)(b)、組2: (a)、組3: (b)。
  3. **非捕獲組** (?:...):不佔用編號,不保存匹配文本,僅用於分組應用量詞。(?:\d+)-(\d+) → 只有 1 個捕獲組。

反向引用:正則內部引用捕獲組

  • 正則中:\1、\2... 引用前面捕獲組內容。(\w+)\s+\1 匹配重複單詞。
  • 替換字符串中:$1、$2... (JS)、\1 (Python/其他)。

方括號 [] vs 圓括號 () 核心區別

特性方括號 []圓括號 ()
核心含義字符類:匹配括號內**任一字符**分組:視為**整體**,可捕獲、可反向引用
量詞作用作用於單字符:[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 回調參數,所見即所得。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved