捕获组:(...)

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

浏览器兼容性

另见