命名捕获组:(?<name>...)

Baseline 广泛可用 *

此特性已经十分成熟,可在许多设备和浏览器版本上使用。自 2020 年 7 月以来,它已在各大浏览器中可用。

* 此特性的某些部分可能存在不同级别的支持。

命名捕获组是一种特殊的捕获组,它允许为组指定一个名称。组的匹配结果可以通过这个名称而不是它在模式中的索引来标识。

语法

正则表达式
(?<name>pattern)

参数

pattern

此模式可以包含任何可在正则表达式字面量中使用的内容,包括或运算符

name

组的名称。必须是有效的标识符

描述

命名捕获组可以像常规捕获组一样使用——它们在结果数组中也有它们的匹配索引,并且可以通过\1\2等引用。唯一的区别是它们可以额外地通过它们的名称引用。捕获组的匹配信息可以通过以下方式访问:

所有名称在同一模式内必须是唯一的。具有相同名称的多个命名捕获组会导致语法错误。

js
/(?<name>)(?<name>)/; // SyntaxError: Invalid regular expression: Duplicate capture group name

如果重复的命名捕获组不在同一个或运算符备选项中,则此限制会放宽,因此对于任何字符串输入,只有一个命名捕获组实际上可以匹配。这是一个相对较新的功能,因此在使用前请检查浏览器兼容性

js
/(?<year>\d{4})-\d{2}|\d{2}-(?<year>\d{4})/;
// Works; "year" can either come before or after the hyphen

所有命名捕获组都将出现在结果中。如果命名捕获组未匹配(例如,它属于或运算符中未匹配的备选项),则 groups 对象上相应的属性值为 undefined

js
/(?<ab>ab)|(?<cd>cd)/.exec("cd").groups; // [Object: null prototype] { ab: undefined, cd: 'cd' }

您可以使用 d 标志获取输入字符串中每个命名捕获组的起始和结束索引。除了通过 exec() 返回的数组的 indices 属性访问它们之外,您还可以通过它们的名称在 indices.groups 上访问它们。

与未命名捕获组相比,命名捕获组具有以下优点:

  • 它们允许您为每个子匹配结果提供描述性名称。
  • 它们允许您访问子匹配结果,而无需记住它们在模式中出现的顺序。
  • 重构代码时,您可以更改捕获组的顺序,而不必担心破坏其他引用。

示例

使用命名捕获组

以下示例从 Git 日志条目(使用 git log --format=%ct,%an -- filename 输出)中解析时间戳和作者名称

js
function parseLog(entry) {
  const { author, timestamp } = /^(?<timestamp>\d+),(?<author>.+)$/.exec(
    entry,
  ).groups;
  return `${author} committed on ${new Date(
    parseInt(timestamp, 10) * 1000,
  ).toLocaleString()}`;
}

parseLog("1560979912,Caroline"); // "Caroline committed on 6/19/2019, 5:31:52 PM"

规范

规范
ECMAScript® 2026 语言规范
# prod-Atom

浏览器兼容性

另见