SyntaxError: invalid capture group name in regular expression

JavaScript 异常 "invalid capture group name in regular expression" 在命名捕获组命名反向引用包含无效标识符时发生。

消息

SyntaxError: Invalid regular expression: /(?<1>)/: Invalid capture group name (V8-based)
SyntaxError: invalid capture group name in regular expression (Firefox)
SyntaxError: Invalid regular expression: invalid group specifier name (Safari)

错误类型

SyntaxError

哪里出错了?

每个命名捕获组都必须有一个有效的标识符作为名称。你不能使用任意字符串作为组标识符。

示例

无效案例

js
/(?<1>\d+) (?<2>\d+)/;

或者你可能正在动态构建正则表达式

js
const tokenTypes = {
  "number literal": /\d+/,
  "string literal": /".+?"/,
  identifier: /[a-zA-Z_]\w*/,
};

const tokenPattern = new RegExp(
  Object.entries(tokenTypes)
    .map(([name, pattern]) => `(?<${name}>${pattern.source})`)
    .join("|"),
);

有效情况

js
/(?<group1>\d+) (?<group2>\d+)/;

如果正则表达式是动态构建的,请确保所有名称都是有效的标识符。例如:

js
const tokenTypes = {
  numberLiteral: /\d+/,
  stringLiteral: /".+?"/,
  identifier: /[a-zA-Z_]\w*/,
};

const tokenPattern = new RegExp(
  Object.entries(tokenTypes)
    .map(([name, pattern]) => `(?<${name}>${pattern.source})`)
    .join("|"),
);

另见