2015-05-21 3 views
3

Я пытаюсь проверить весь мой сценарий through the new JSLint, но с этим:Что не так с этим регулярным выражением? JSLint бросает ошибку

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

Он бросает:

Unexpected 'x' after '\'.

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

Старая версия не приводит к возникновению ошибок с этим. Я понимаю, что он в бета-версии, но я бы ожидал, что он будет работать так же хорошо, как и старая версия. Например, \x00 обозначает нулевой символ.

Итак, это что-то, что изменилось с помощью ECMAScript 6? Это просто ошибка JSLint? Я действительно что-то делаю неправильно?

+0

с '/ [\ x00] */g' не получил ошибок – Deadooshka

+0

Да, я это заметил. Неправильно ли указывать символ регулярного выражения без скобок? – WilliamTheBaker

+0

@ WilliamTheBaker-no. Вы также можете использовать '/ \ u0000 /' (что похоже на JSLint), поскольку четыре значащих шестнадцатеричных значения [* конкретно разрешены *] (http://ecma-international.org/ecma-262/5.1/#sec-6) ECMA-262, тогда как двузначные значения, такие как '\ x00', не являются (насколько я могу судить). Однако это порождает ошибку: «null не является объектом», вы должны использовать '/ \ u0000 * /'. – RobG

ответ

0

Согласно спецификации ECMAScript:

  • \x00 действительна при расширении грамматики:

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

    и образец семантической:

    The production CharacterEscape :: HexEscapeSequence evaluates by evaluating the CV of the HexEscapeSequence (see 7.8.4) and returning its character result.

  • \0 всегда интерпретируется как сопоставляя символ NUL, под картина семантику DecimalEscape:

    The production DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit] evaluates as follows:

    1. Let i be the MV of DecimalIntegerLiteral .
    2. If i is zero, return the EscapeValue consisting of a <NUL> character (Unicode value 0000).
    3. Return the EscapeValue consisting of the integer i .

    The definition of "the MV of DecimalIntegerLiteral " is in 7.8.3.

    NOTE If \ is followed by a decimal number n whose first digit is not 0, then the escape sequence is considered to be a backreference. It is an error if n is greater than the total number of left capturing parentheses in the entire regular expression. \0 represents the <NUL> character and cannot be followed by a decimal digit.

Поэтому, я не знаю, почему JSLint запрещает эти конструкции. С некоторого тестирования, кажется, что они не реализованы в парсер, так как простые коды, как это:

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

бросает "Unexpected '1' after '\'." ошибку.

Для того, чтобы получить код для пропуска JSLint, вы можете указать NUL символ, содержащий \u0000. В противном случае вы можете просто проигнорировать эту ошибку.

+0

Я думаю, что это объяснение так же хорошо, как и получается. Таким образом, вероятно, правильно предположить, что это либо ошибка в синтаксическом анализаторе, либо еще не реализована, поскольку она находится в бета-версии. Вы нашли это в документации ECMA? Могу ли я получить ссылку, если это не слишком беспокоит? Я не могу игнорировать его, поскольку с тех пор, как синтаксический анализатор останавливается там и не продолжается, поэтому я предполагаю, что я буду использовать '\ u0000'. Благодаря! – WilliamTheBaker

+0

@WilliamTheBaker: текст в цитате приводится в документации. Вы можете найти спецификацию здесь: http://www.ecma-international.org/ecma-262/5.1/ – nhahtdh

+0

Хорошо, спасибо. – WilliamTheBaker

3

The "A regular expression literal can be confused with '/='" error is thrown when JSLint, JSHint (prior to version 1.0.0) or ESLint encounters a regular expression literal that begins with the = character. In the following example we attempt to assign a regular expression literal to match the string "=1" to the variable x:

This error is raised to highlight a potentially confusing piece of code. Your code will run fine if you do not fix this error, but it may be confusing to others, especially at first glance to someone quickly searching through your script.

The/character is ambiguous in JavaScript. It can either signify the start or end of a regular expression literal, as it does in the example above, or it can be interpreted as the division operator. Like most of the arithmetic operators, the division operator can be combined with the assignment operator to produce a shorthand:

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 

Tip

символ NULL \x00 может быть сокращен до \0 (MDN docs)

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

-

Update

@ ответ nhahtdh показывает, что вы можете использовать /\u0000*/g буквального.

+0

JSLint дает ту же ошибку, что и с '\ x00'. – Siguza

+0

Ну, это говорит '0' сейчас:' Неожиданный '0' после '\'. Но проблема не устранена. – Siguza

+0

Это вызывает «Неожиданный» 0 после «\».: P – WilliamTheBaker

Смежные вопросы