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

时间:2015-05-21 06:21:47

标签: javascript regex jslint

我试图验证我的整个脚本 through the new JSLint ,但是这样:

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

它抛出:

  

意外' x'在' \'。

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

旧版本没有抛出任何错误。我意识到它处于测试阶段,但我希望它的效果与旧版本一样好。顺便说一下,\x00代表空字符。

那么,ECMAScript 6是否有所改变?它只是一个JSLint错误吗?我实际上做错了吗?

2 个答案:

答案 0 :(得分:3)

  

“正则表达式文字可能与'/ ='混淆”当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

提示

NULL字符\x00可缩短为\0MDN docs

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

-

更新

@ nhahtdh的回答显示您可以使用/\u0000*/g字面值。

答案 1 :(得分:0)

根据ECMAScript规范:

  • \x00在语法扩展下有效:

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

    和模式语义:

      

    生产CharacterEscape :: HexEscapeSequence通过评估HexEscapeSequence的CV(见7.8.4)并返回其字符结果来评估。

  • \0始终被解释为与DecimalEscape的模式语义匹配NUL字符:

      

    生产DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit]评估如下:

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

      DecimalIntegerLiteral的MV”的定义见7.8.3。

           

      注意如果\之后是第一个数字不为0的十进制数n,则转义序列被认为是   反向引用。如果n大于整个常规中左侧捕获括号的总数,则会出错   表达。 \0代表<NUL>字符,后面不能跟十进制数字。

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

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

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

如果要获取传递JSLint的代码,可以使用\u0000指定NUL字符。否则,您可以忽略此错误。