捕獲組:(...)

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

捕獲組將一個子模式分組,允許您將量詞應用於整個組或在其中使用或運算子。它會記住有關子模式匹配的資訊,以便您以後可以透過反向引用引用它,或者透過匹配結果訪問該資訊。

如果您不需要子模式匹配的結果,請改用非捕獲組,這可以提高效能並避免重構風險。

語法

正則表示式
(pattern)

引數

pattern

此模式可以包含任何可在正則表示式字面量中使用的內容,包括或運算子

描述

捕獲組的作用類似於 JavaScript 表示式中的分組運算子,允許您將子模式用作單個原子

捕獲組按其開括號的順序編號。第一個捕獲組編號為1,第二個為2,依此類推。命名捕獲組也是捕獲組,並與其他(未命名)捕獲組一起編號。捕獲組的匹配資訊可以透過以下方式訪問:

注意:即使在 exec() 的結果陣列中,捕獲組也透過數字 12 等訪問,因為 0 元素是整個匹配。\0 不是反向引用,而是 NUL 字元的字元轉義

正則表示式原始碼中的捕獲組與其結果一一對應。如果捕獲組不匹配(例如,它屬於或運算子中不匹配的替代項),則相應的結果為 undefined

js
/(ab)|(cd)/.exec("cd"); // ['cd', undefined, 'cd']

捕獲組可以量化。在這種情況下,與此組對應的匹配資訊是該組的最後一次匹配。

js
/([ab])+/.exec("abc"); // ['ab', 'b']; because "b" comes after "a", this result overwrites the previous one

捕獲組可以在先行斷言後行斷言中使用。由於後行斷言向後匹配其原子,因此與此組對應的最終匹配是出現在字串左端的那個。但是,匹配組的索引仍然對應於它們在正則表示式原始碼中的相對位置。

js
/c(?=(ab))/.exec("cab"); // ['c', 'ab']
/(?<=(a)(b))c/.exec("abc"); // ['c', 'a', 'b']
/(?<=([ab])+)c/.exec("abc"); // ['c', 'a']; because "a" is seen by the lookbehind after the lookbehind has seen "b"

捕獲組可以巢狀,在這種情況下,外層組首先編號,然後是內層組,因為它們按其開括號的順序排列。如果巢狀組被量詞重複,則每次組匹配時,子組的結果都會被覆蓋,有時會是 undefined

js
/((a+)?(b+)?(c))*/.exec("aacbbbcac"); // ['aacbbbcac', 'ac', 'a', undefined, 'c']

在上面的示例中,外部組匹配了三次

  1. 匹配 "aac",子組為 "aa"undefined"c"
  2. 匹配 "bbbc",子組為 undefined"bbb""c"
  3. 匹配 "ac",子組為 "a"undefined"c"

第二次匹配的 "bbb" 結果沒有保留,因為第三次匹配將其覆蓋為 undefined

您可以使用 d 標誌獲取輸入字串中每個捕獲組的開始和結束索引。這會在 exec() 返回的陣列上建立一個額外的 indices 屬性。

您可以選擇為捕獲組指定名稱,這有助於避免與組位置和索引相關的陷阱。有關更多資訊,請參閱命名捕獲組

括號在不同的正則表示式語法中有其他用途。例如,它們也用於包含先行斷言和後行斷言。由於這些語法都以 ? 開頭,而 ? 是一個量詞,通常不能直接出現在 ( 之後,因此這不會導致歧義。

示例

匹配日期

以下示例匹配 YYYY-MM-DD 格式的日期

js
function parseDate(input) {
  const parts = /^(\d{4})-(\d{2})-(\d{2})$/.exec(input);
  if (!parts) {
    return null;
  }
  return parts.slice(1).map((p) => parseInt(p, 10));
}

parseDate("2019-01-01"); // [2019, 1, 1]
parseDate("2019-06-19"); // [2019, 6, 19]

配對引號

以下函式匹配字串中的 title='xxx'title="xxx" 模式。為了確保引號匹配,我們使用反向引用來引用第一個引號。訪問第二個捕獲組 ([2]) 將返回匹配引號字元之間的字串

js
function parseTitle(metastring) {
  return metastring.match(/title=(["'])(.*?)\1/)[2];
}

parseTitle('title="foo"'); // 'foo'
parseTitle("title='foo' lang='en'"); // 'foo'
parseTitle('title="Named capturing groups\' advantages"'); // "Named capturing groups' advantages"

規範

規範
ECMAScript® 2026 語言規範
# prod-Atom

瀏覽器相容性

另見