反向引用到否定前瞻断言¶
ID: js/regex/back-reference-to-negative-lookahead
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- reliability
- correctness
- regular-expressions
Query suites:
- javascript-security-and-quality.qls
反向引用可以用来引用之前匹配的捕获组的结果。从否定前瞻断言外部引用嵌套在该断言内的捕获组在语法上是合法的,但由于正则表达式只有在否定前瞻断言主体未匹配时才能匹配,因此这种反向引用始终匹配空字符串。这可能表明存在错误。
建议¶
如果反向引用是无用的,则将其删除,或者修复正则表达式以确保引用引用的是预期的捕获组。
示例¶
在以下示例中,反向引用`\2
` 指的是否定前瞻断言`(?!(a+)b)
` 内的捕获组`(a+)
`。
/(.*?)a(?:d*)a(?!(a+)b)\2(.*)/;
如果正则表达式更新不一致,则可能会出现这种无用的反向引用。例如,在这个示例中,组`(?:d*)
` 最初可能是捕获的,因此反向引用`\2
` 将引用它,而不是否定前瞻断言内的捕获组。如果是这种情况,则组`(?:d*)
` 应该重新设置为捕获状态,即应将其替换为`(d*)
`。
请注意,从同一个否定前瞻断言内部引用捕获组是没有问题的。
参考¶
Ecma International,ECMAScript 语言定义,第 5.1 版,第 15.10.2.8 节。ECMA,2011。