【问题标题】:jshint rejects regex - why?jshint 拒绝正则表达式 - 为什么?
【发布时间】:2018-01-30 18:23:26
【问题描述】:
# 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。

【问题讨论】:

  • This regex101 清楚地显示了模式中破折号的错误。可能jshint不理解unicode修饰符?
  • @JeffreyWesterkamp 见regex101.com/r/rO06B7/1,你忘了u修饰符。
  • 嗯刚刚发现 /u 是 ECMAScript 6 中的新功能?因此,鉴于我的目标平台,我遇到的问题比 jshint 拒绝它更大。
  • @ctwheels:这实际上意味着不同的东西(请参阅mathiasbynens.be/notes/javascript-escapes#unicode-code-point 了解\u{nnnn} 的含义)。它仍然失败,虽然这次没有第一​​个错误消息行
  • 你在说什么更大的问题

标签: javascript regex unicode ecmascript-6 jshint


【解决方案1】:

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

查看以下未解决的问题:

因此,这是行不通的。我不知道您是否可以在不让解析器更普遍地中断的情况下禁止对该行进行检查。

但是,事实证明您的某些目标浏览器(IE10 和 IE11)也不支持这些功能,所以这一点没有实际意义。


解决方法

将正则表达式转换为有效的 ES5(使用 regexpuan 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])/;

正确性尚未完全确定,但我没有理由怀疑该工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2011-06-06
    相关资源
    最近更新 更多