JS 命名捕获组的写法与兼容
命名捕获组用小于号加组名声明,匹配结果通过结果对象的命名分组属性读取,替换模板里可按名字引用,模式内部也能按名字反向引用。它的价值在于取值代码不再依赖括号顺序。限制在于:属于较新的语言特性,老环境不支持时字面量形式会让脚本在解析阶段失败。
基本信息
| 声明写法 | 左括号后跟问号、小于号、组名、大于号,再写分组内容 |
|---|---|
| 结果读取 | 匹配结果对象上有一个命名分组对象属性,未参与的组为未定义值 |
| 替换引用 | 替换模板里用美元符号加尖括号加组名引用 |
| 模式内引用 | 反向引用写作反斜杠加字母 k 加尖括号加组名 |
| 下标信息 | 启用区间标志后,命名分组的下标信息也可按名取到 |
典型使用场景
- 多字段提取:从日志或 URL 中按名字取字段,模式调整后取值代码无需改动
- 替换改写:替换模板按名字引用分组,长模式里比序号清晰
- 配置规则复现:规则由配置文件提供时,命名比序号更容易被非开发人员维护
- 模式复用:同一条模式在多种语言间迁移时,命名组是更稳定的接口
- 兼容性探测:用构造器检测环境是否支持,避免解析期失败
写法与兼容处理
写法与兼容处理
const re = /(?<user>\w+)@(?<host>[\w.]+)/;
const m = re.exec('ops@example.com');
m.groups.user; // 'ops':按名字取值
m.groups.missing; // undefined:未参与的组是未定义值
'ab'.replace(/(?<x>a)/, '$<x>$<x>'); // 'aab':替换模板按名字引用
/(?<q>['"]).*?\k<q>/.test("'a'"); // 模式内按名字反向引用
let ok = true;
try { new RegExp('(?<n>a)') } catch { ok = false } // 构造器探测,避免解析期报错
// 结果对象的命名分组属性仅在模式含命名组时存在,取值前判空用法与注意点
| 用途 | 写法 | 注意 |
|---|---|---|
| 声明 | 问号加小于号加组名 | 组名需符合标识符规则 |
| 取值 | 结果对象命名分组属性 | 无命名组时该属性不存在 |
| 替换引用 | 美元符号加尖括号加组名 | 老环境不支持时按字面文本处理 |
| 模式内引用 | 反斜杠加 k 加组名 | 与命名组同时引入,兼容性一致 |
| 下标 | 区间标志下的命名下标 | 需要较新运行时支持 |
命名组的具体命名限制由标识符规则决定,Unicode 模式下的可用字符范围更宽;跨环境复用时建议只用字母、数字与下划线,且不以数字开头。
转译工具把命名组降级为序号组时,命名分组属性可能以兼容方式模拟,但行为细节并不完全等价;依赖命名分组的生产代码应同时覆盖转译产物与非转译产物。