ESLint 和后顾断言

6
我有一个带有回顾断言的正则表达式,但 ESLint 似乎无法识别其有效性。然而前瞻断言是可以的。
我可以使用最新版本的 ESLint(我使用了 在线演示)和非常简单且人为的示例来重现此问题。
前瞻断言:如果后面跟着 d,则匹配 b(仅匹配 b)。
'bd'.match(/b(?=d)/) //=> ['b']
'be'.match(/b(?=d)/) //=> null

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

enter image description here

回顾断言:如果前面跟着a,则匹配b(仅限b):

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

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

enter image description here

问题:我的正则表达式有什么问题导致ESLint报错?


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

{
    "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": {}
}

1
它应该至少是 "ecmaVersion": 9默认值5,这相当老旧。 - Wiktor Stribiżew
1个回答

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

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。回顾先行断言符合 ECMAScript 2018 标准,因此您需要确保将 ecmaVersion 设置为至少 9

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

有没有逐个文件的注释版本?只是为了好玩,我尝试使用 /* eslint-env es9 */ 来模仿 ESLint 文档 中的 /* eslint-env es6 */(似乎不存在 es9 快捷方式),并尝试使用 /* eslint-env ecmaVersion:9 */ 看看是否会成功(但我没有)。似乎 /* eslint-env es2020 */ 会清除它,但我仍然发现回溯正则表达式无效。 - ruffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接