这个正则表达式有什么问题?JSLint抛出错误

What's wrong with this regex? JSLint is throwing an error

本文关键字:JSLint 出错 错误 问题 正则表达式 什么      更新时间:2023-09-26

我试图通过新的JSLint验证我的整个脚本,但是有了这个:

function a() {
    'use strict';
    var string;
    string = string.replace(/'x00*/g, '');
}

它抛出:

string = string.replace(/'x00*/g, '');

旧版本不会抛出错误。我知道它还在测试阶段,但我希望它能和旧版本一样好用。顺便说一下,'x00代表空字符。

那么,这是ECMAScript 6改变的东西吗?这只是一个JSLint bug吗?我真的做错了什么吗?

正则表达式字面量可能与'/='"当JSLint, JSHint(1.0.0版本之前)或ESLint遇到以=字符开头的正则表达式字面量时抛出错误。在下面的例子中,我们尝试分配一个正则表达式文字来匹配字符串"=1"到变量x:

此错误被抛出以突出显示可能令人困惑的代码段。如果您不修复这个错误,您的代码将运行良好,但它可能会让其他人感到困惑,特别是对于快速搜索您的脚本的人来说,第一眼就会感到困惑。

/字符在JavaScript中是不明确的。它既可以表示正则表达式字面量的开始或结束,就像上面的例子一样,也可以解释为除法运算符。与大多数算术操作符一样,除法操作符可以与赋值操作符组合使用,从而产生以下简写:

https://jslinterrors.com/a-regular-expression-literal-can-be-confused-with

所以你需要使用RegExp构造函数:
string.replace(new RegExp('''x00*', 'g'), '');

输出与正则表达式字面量相同的正则表达式:

console.log(new RegExp('''x00*', 'g').toString() === /'x00*/g.toString()); // true
小费

空字符'x00可以缩短为'0 (MDN docs)

new RegExp('''0*', 'g')

,

更新

@nhahtdh的答案显示您可以使用/'u0000*/g literal

根据ECMAScript规范:

  • 'x00是有效的,语法扩展为:

    Atom -> ' AtomEscape
    AtomEscape -> CharacterEscape
    CharacterEscape -> HexEscapeSequence
    HexEscapeSequence -> x HexDigit HexDigit
    

    和模式语义:

    产品CharacterEscape :: HexEscapeSequence通过计算HexEscapeSequence的CV(见7.8.4)并返回其字符结果来求值。

  • '0总是被解释为匹配NUL字符,在DecimalEscape的模式语义下:

    产品DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit]的计算如下:

    1. iDecimalIntegerLiteral的MV
    2. 如果i为零,则返回由<NUL>字符(Unicode值0000)组成的EscapeValue
    3. 返回由整数i组成的EscapeValue

    " The MV of DecimalIntegerLiteral "的定义见7.8.3.

    如果'后面跟一个第一位不为0的十进制数n,则认为转义序列为backreference。如果n大于整个正则中左捕获括号的总数,则会产生错误表达式。'0表示<NUL>字符,后面不能跟十进制数字

因此,我不确定为什么JSLint禁止这些结构。从一些测试来看,它们似乎没有在解析器中实现,因为像这样的简单代码:

var x = /(['"])'1/;

抛出"Unexpected '1' after '''."错误。

如果你想让代码传递JSLint,你可以用'u0000指定NUL字符。否则,可以忽略此错误。