jshint 拒绝正则表达式 - 为什么?
jshint rejects regex - why?
# 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 声称 JavaScript 引擎在全 unicode 模式下是可以的。
我遇到了同样的问题:
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。
jshint 确实不支持 ES6 的 Unicode 感知正则表达式(或更普遍的 \u{....}
文字)(在撰写本文时,最新版本是 v2.9.5)。
查看以下未解决的问题:
因此,这是行不通的。我不知道您是否可以在不让解析器更普遍地中断的情况下抑制对此行的检查。
然而,事实证明您的某些目标浏览器(IE10 和 IE11)也不支持这些功能,所以这一点没有实际意义。
解决方法
将正则表达式转换为有效的 ES5(使用 regexpu, or an online interface to the same),结果如下:
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])/;
正确性尚未完全确定,但我没有理由怀疑该工具。
# 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 声称 JavaScript 引擎在全 unicode 模式下是可以的。
我遇到了同样的问题:
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。
jshint 确实不支持 ES6 的 Unicode 感知正则表达式(或更普遍的 \u{....}
文字)(在撰写本文时,最新版本是 v2.9.5)。
查看以下未解决的问题:
因此,这是行不通的。我不知道您是否可以在不让解析器更普遍地中断的情况下抑制对此行的检查。
然而,事实证明您的某些目标浏览器(IE10 和 IE11)也不支持这些功能,所以这一点没有实际意义。
解决方法
将正则表达式转换为有效的 ES5(使用 regexpu, or an online interface to the same),结果如下:
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])/;
正确性尚未完全确定,但我没有理由怀疑该工具。