捕获组:(...)
捕获组将一个子模式分组,允许您将量词应用于整个组或在其中使用或运算符。它会记住有关子模式匹配的信息,以便您以后可以通过反向引用引用它,或者通过匹配结果访问该信息。
如果您不需要子模式匹配的结果,请改用非捕获组,这可以提高性能并避免重构风险。
语法
(pattern)
参数
描述
捕获组的作用类似于 JavaScript 表达式中的分组运算符,允许您将子模式用作单个原子。
捕获组按其开括号的顺序编号。第一个捕获组编号为1,第二个为2,依此类推。命名捕获组也是捕获组,并与其他(未命名)捕获组一起编号。捕获组的匹配信息可以通过以下方式访问:
- RegExp.prototype.exec()、- String.prototype.match()和- String.prototype.matchAll()的返回值(一个数组)
- String.prototype.replace()和- String.prototype.replaceAll()方法的- replacement回调函数的- pN参数
- 同一模式中的反向引用
注意:即使在 exec() 的结果数组中,捕获组也通过数字 1、2 等访问,因为 0 元素是整个匹配。\0 不是反向引用,而是 NUL 字符的字符转义。
正则表达式源代码中的捕获组与其结果一一对应。如果捕获组不匹配(例如,它属于或运算符中不匹配的替代项),则相应的结果为 undefined。
/(ab)|(cd)/.exec("cd"); // ['cd', undefined, 'cd']
捕获组可以量化。在这种情况下,与此组对应的匹配信息是该组的最后一次匹配。
/([ab])+/.exec("abc"); // ['ab', 'b']; because "b" comes after "a", this result overwrites the previous one
捕获组可以在先行断言和后行断言中使用。由于后行断言向后匹配其原子,因此与此组对应的最终匹配是出现在字符串左端的那个。但是,匹配组的索引仍然对应于它们在正则表达式源代码中的相对位置。
/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。
/((a+)?(b+)?(c))*/.exec("aacbbbcac"); // ['aacbbbcac', 'ac', 'a', undefined, 'c']
在上面的示例中,外部组匹配了三次
- 匹配 "aac",子组为"aa"、undefined和"c"。
- 匹配 "bbbc",子组为undefined、"bbb"和"c"。
- 匹配 "ac",子组为"a"、undefined和"c"。
第二次匹配的 "bbb" 结果没有保留,因为第三次匹配将其覆盖为 undefined。
您可以使用 d 标志获取输入字符串中每个捕获组的开始和结束索引。这会在 exec() 返回的数组上创建一个额外的 indices 属性。
您可以选择为捕获组指定名称,这有助于避免与组位置和索引相关的陷阱。有关更多信息,请参阅命名捕获组。
括号在不同的正则表达式语法中有其他用途。例如,它们也用于包含先行断言和后行断言。由于这些语法都以 ? 开头,而 ? 是一个量词,通常不能直接出现在 ( 之后,因此这不会导致歧义。
示例
匹配日期
以下示例匹配 YYYY-MM-DD 格式的日期
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]) 将返回匹配引号字符之间的字符串
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 | 
浏览器兼容性
加载中…