语法
正则表达式
(?<name>pattern)
参数
描述
命名捕获组可以像常规捕获组一样使用——它们在结果数组中也有它们的匹配索引,并且可以通过\1、\2等引用。唯一的区别是它们可以额外地通过它们的名称引用。捕获组的匹配信息可以通过以下方式访问:
RegExp.prototype.exec()、String.prototype.match()和String.prototype.matchAll()的返回值的groups属性String.prototype.replace()和String.prototype.replaceAll()方法的replacement回调函数的groups参数- 同一模式内的命名反向引用
所有名称在同一模式内必须是唯一的。具有相同名称的多个命名捕获组会导致语法错误。
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 |
浏览器兼容性
加载中…