CodeQL 文档

未绑定反向引用

ID: js/regex/unbound-back-reference
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - reliability
   - correctness
   - regular-expressions
Query suites:
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

在正则表达式中,反向引用可以用于引用之前匹配的捕获组的结果。ECMAScript 标准禁止使用“\n”形式的反向引用,其中“n”是大于正则表达式中捕获组数量的正数。

虽然许多浏览器允许此类引用,并将它们解释为普通字符转义,但这是一种非标准行为,不应该依赖于它。如果正则表达式稍后发生更改,它也可能成为错误的来源,因为字符转义可能会开始匹配新引入的捕获组。

建议

如果反向引用用于引用捕获组,请确保存在具有正确数量的捕获组。如果它用于转义序列,请将其转换为十六进制字符转义,这与 ECMAScript 兼容。

示例

在以下示例中,反向引用\1可能用于引用组(?:\s+)匹配的字符串。但是,该组是非捕获组。

/^(?:\s+)\w+\1$/;

要解决此问题,请将组转换为捕获组(\s+)

如果\1实际上用于匹配字符代码为 1 的字符,则应将其重写为十六进制字符转义\x01

参考

  • Ecma 国际,《ECMAScript 语言规范》,第 5.1 版,第 15 节。ECMA,2011 年。

  • Mozilla 开发者网络:JavaScript 正则表达式.

  • ©GitHub, Inc.
  • 条款
  • 隐私