ESLint和后置断言 [英] ESLint and lookbehind assertion

查看:105
本文介绍了ESLint和后置断言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有后向断言的正则表达式,认为ESLint似乎没有被识别为有效.但是,先行断言是可以的.

我可以使用最新版本的ESLint(我使用过

后置断言:如果在 a 之前,则匹配 b (并且仅匹配 b ):

 'ab'.match(/(?< = a)b/)//=>['b']'eb'.match(/(?< = a)b/)//=>空值 

ESLint无法将/(?? <= a)b/识别为有效的正则表达式:

问题:导致ESLint抱怨的我的正则表达式怎么了?


上面的演示中使用的ESLint配置:

 <代码> {"parserOptions":{"ecmaVersion":5"sourceType":脚本","ecmaFeatures":{}},规则":{"constructor-super":2定向":2"getter-return":2"no-async-promise-executor":2无案声明":2"no-class-assign":2"no-compare-neg-zero":2,无条件分配":2"no-const-assign":2非恒定条件":2"no-control-regex":2无调试器":2"no-delete-var":2"no-dupe-args":2无重复类别成员":2"no-dupe-else-if":2无重复键":2无重复情况":2无空":2无空字符类":2无空模式":2"no-ex-assign":2无布尔值转换":2"no-extra-semi":2,无穿透":2"no-func-assign":2"no-global-assign":2,"no-import-assign":2无内部声明":2"no-invalid-regexp":2"no-irregular-whitespace":2无误导性字符类":2"no-mixed-spaces-and-tabs":2没有新符号":2,"no-obj-calls":2,无八进制":2"no-prototype-builtins":2,不重新声明":2"no-regex-spaces":2,没有自我分配":2不退还":2无阴影限制名称":2无稀疏数组":2在此之前没有超级":2"no-undef":2,非意外多行":2不可到达":2绝对不安全最终":2禁止不否定":2未使用的标签":2,"no-unused-vars":2无用捕获":2无用的逃脱":2禁止":2所需产量":2"use-isnan":2,"valid-typeof":2}," env":{}} 

解决方案

您可以参考 指定解析器选项 参考:

ecmaVersion -设置为3、5(默认),6、7、8、9、10、11或12,以指定要使用的ECMAScript语法的版本.您还可以设置为2015(等于6),2016(等于7),2017(等于8),2018(等于9),2019(等于10),2020(等于11)或2021(与12相同)以使用基于年份的命名.

如您所见,默认值为 5 ,这意味着它仅支持ES5.Lookbehinds 兼容ECMAScript 2018 ,因此您需要确保自己将 ecmaVersion 设置为至少 9 :

 "parserOptions":{"ecmaVersion":9"sourceType":脚本","ecmaFeatures":{}}, 

I have a regular expression with a lookbehind assertion that ESLint doesn't seem to recognise as valid. However lookahead assertions are fine.

I can reproduce this issue with the latest version of ESLint (I've used the online demo) and with very simple and contrived examples.

Lookahead assertion: match b (and only b) if followed by d:

'bd'.match(/b(?=d)/) //=> ['b']
'be'.match(/b(?=d)/) //=> null

ESLint recognises /b(?=d)/ as valid regular expression:

Lookbehind assertion: match b (and only b) if preceded by a:

'ab'.match(/(?<=a)b/) //=> ['b']
'eb'.match(/(?<=a)b/) //=> null

ESLint doesn't recognise /(?<=a)b/ as a valid regular expression:

Question: what's wrong with my regular expression that causes ESLint to complain?


ESLint configuration used in the demos above:

{
    "parserOptions": {
        "ecmaVersion": 5,
        "sourceType": "script",
        "ecmaFeatures": {}
    },
    "rules": {
        "constructor-super": 2,
        "for-direction": 2,
        "getter-return": 2,
        "no-async-promise-executor": 2,
        "no-case-declarations": 2,
        "no-class-assign": 2,
        "no-compare-neg-zero": 2,
        "no-cond-assign": 2,
        "no-const-assign": 2,
        "no-constant-condition": 2,
        "no-control-regex": 2,
        "no-debugger": 2,
        "no-delete-var": 2,
        "no-dupe-args": 2,
        "no-dupe-class-members": 2,
        "no-dupe-else-if": 2,
        "no-dupe-keys": 2,
        "no-duplicate-case": 2,
        "no-empty": 2,
        "no-empty-character-class": 2,
        "no-empty-pattern": 2,
        "no-ex-assign": 2,
        "no-extra-boolean-cast": 2,
        "no-extra-semi": 2,
        "no-fallthrough": 2,
        "no-func-assign": 2,
        "no-global-assign": 2,
        "no-import-assign": 2,
        "no-inner-declarations": 2,
        "no-invalid-regexp": 2,
        "no-irregular-whitespace": 2,
        "no-misleading-character-class": 2,
        "no-mixed-spaces-and-tabs": 2,
        "no-new-symbol": 2,
        "no-obj-calls": 2,
        "no-octal": 2,
        "no-prototype-builtins": 2,
        "no-redeclare": 2,
        "no-regex-spaces": 2,
        "no-self-assign": 2,
        "no-setter-return": 2,
        "no-shadow-restricted-names": 2,
        "no-sparse-arrays": 2,
        "no-this-before-super": 2,
        "no-undef": 2,
        "no-unexpected-multiline": 2,
        "no-unreachable": 2,
        "no-unsafe-finally": 2,
        "no-unsafe-negation": 2,
        "no-unused-labels": 2,
        "no-unused-vars": 2,
        "no-useless-catch": 2,
        "no-useless-escape": 2,
        "no-with": 2,
        "require-yield": 2,
        "use-isnan": 2,
        "valid-typeof": 2
    },
    "env": {}
}

解决方案

You can refer to the Specifying Parser Options reference:

ecmaVersion - set to 3, 5 (default), 6, 7, 8, 9, 10, 11, or 12 to specify the version of ECMAScript syntax you want to use. You can also set to 2015 (same as 6), 2016 (same as 7), 2017 (same as 8), 2018 (same as 9), 2019 (same as 10), 2020 (same as 11), or 2021 (same as 12) to use the year-based naming.

As you can see, the default value is 5, meaning it only supports ES5. Lookbehinds are compliant with ECMAScript 2018, so you need to make sure you set ecmaVersion to at least 9:

"parserOptions": {
        "ecmaVersion": 9,
        "sourceType": "script",
        "ecmaFeatures": {}
    },

这篇关于ESLint和后置断言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆