命名捕获组通过(?<name>...)语法为子表达式赋予语义化名称,支持match.groups.name访问、$<name>替换、\k<name>反向引用,提升可读性与可维护性,主流环境已广泛支持。

命名捕获组让正则匹配结果一目了然,不用再数 match[1]、match[2] 到底对应哪一部分。它把括号里的子表达式赋予语义化名称,直接通过名字取值,逻辑更清晰,协作和维护成本明显降低。
怎么写命名捕获组
语法很简单:在开括号后加 ?<name>,比如 (?<year>\d{4}) 表示捕获四位数字并命名为 year。
- 完整日期解析:
/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/ - 匹配后通过
match.groups.year、match.groups.month直接访问 - 支持解构赋值:
const { year, month } = match.groups
在 replace 中用名字更安全
替换字符串时,传统用 、 容易因调整分组顺序出错;现在可用 $<name> 显式引用:
-
"2025-06-06".replace(/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/, "$<m>/$<d>/$<y>")→"06/06/2025" - 回调函数中也能用:
str.replace(reg, (m, ...args) => { const { y, m: mon } = args.pop().groups; return `${y}-${mon}`; })
还能反向引用名字
需要重复匹配同一内容时,不用记编号,用 \k<name> 即可:
-
/(?<word>\w+)\s+\k<word>/匹配连续重复的单词,如"test test" - 比
(\w+)\s+\1更直观,重命名或增删分组也不影响引用逻辑
兼容性与注意事项
命名捕获组需配合 u 或其他现代标志使用,主流浏览器(Chrome 64+、Firefox 78+、Safari 11.1+)及 Node.js 10+ 均已支持。
- 正则字面量中命名不能重复,否则报错
- 命名只允许 ASCII 字母、数字和下划线,且不能以数字开头
- 如果正则没匹配成功,
match?.groups是undefined,建议加可选链或判断


















