jshint拒绝正则表达式 - 为什么?

时间:2018-01-30 18:23:26

标签: javascript regex unicode ecmascript-6 jshint

# cat test.js
function foo() {
    var bmp = /^[\u{0020}-\u{007e}\u{00A0}-\u{FFFF}]+$/u;
}

# jshint test.js
test.js: line 2, col 15, Invalid regular expression.
test.js: line 2, col 56, Missing semicolon.
test.js: line 2, col 56, Expected an assignment or function call and instead saw an expression.

3 errors

# jshint -v
jshint v2.9.5

我在其他地方看过有关旧版本jshint拒绝有效正则表达式的帖子。这是一个例子,还是我的表达有问题? https://regex101.com声称可以使用完全unicode模式的JavaScript引擎。

我遇到同样的问题:

var combine = /[\u{0020}-\u{007e}\u{00A0}-\u{0300}\u{036F}-\u{1AB0}\u{1AFF}-\u{1DC0}\u{1DCF}-\u{20D0}\u{20FF}-\u{FE20}\u{FE2F}-\u{FFFF}]/u;

对于奖励积分,如果此 jshint限制,我可以告诉它忽略此行吗?我对构建环境的控制不足以升级到更高版本的jshint。

1 个答案:

答案 0 :(得分:1)

jshint确实不支持ES6的Unicode感知正则表达式(或更普遍的\u{....}文字)(在撰写本文时,最新版本是v2.9.5) )。

请参阅以下未解决的问题:

因此,这不起作用。我不知道你是否可以在没有解析器破坏的情况下抑制对这一行的检查。

然而,事实证明你的一些目标浏览器(IE10和IE11)也不支持这些功能,所以重点是没有用。

解决方法

将正则表达式映射到有效的ES5(使用https://github.com/jshint/jshint/pull/2413regexpu),从而产生以下结果:

var bmp = /^(?:[ -~\xA0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+$/;

var combine = /(?:[ -~\xA0-\u0300\u036F-\u1AB0\u1AFF-\u1DC0\u1DCF-\u20D0\u20FF-\uD7FF\uE000-\uFE20\uFE2F-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/;

正确性还没有完全确定,但我没有理由怀疑这个工具。