简体   繁体   English

ESLint 和后视断言

[英]ESLint and lookbehind assertion

I have a regular expression with a lookbehind assertion that ESLint doesn't seem to recognise as valid.我有一个带有后视断言的正则表达式,ESLint 似乎认为它无效。 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.我可以使用最新版本的 ESLint(我使用过在线演示)以及非常简单和人为的示例来重现这个问题。

Lookahead assertion: match b (and only b ) if followed by d :前向断言:匹配b (且仅b )如果随后d

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

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

在此处输入图片说明

Lookbehind assertion: match b (and only b ) if preceded by a :向后断言:匹配b (且仅b )如果前面由a

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

ESLint doesn't recognise /(?<=a)b/ as a valid regular expression: ESLint 无法将/(?<=a)b/识别为有效的正则表达式:

在此处输入图片说明

Question: what's wrong with my regular expression that causes ESLint to complain?问题:我的正则表达式有什么问题导致 ESLint 抱怨?


ESLint configuration used in the demos above:上面演示中使用的 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": {}
}

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. ecmaVersion - 设置为 3、5(默认)、 ecmaVersion或 12 以指定要使用的 ECMAScript 语法版本。 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.您也可以设置为2015(同6)、2016(同7)、2017(同8)、2018(同9)、2019(同10)、2020(同11)或2021(同 12) 使用基于年份的命名。

As you can see, the default value is 5 , meaning it only supports ES5.如您所见,默认值为5 ,这意味着它仅支持 ES5。 Lookbehinds are compliant with ECMAScript 2018 , so you need to make sure you set ecmaVersion to at least 9 : Lookbehinds符合 ECMAScript 2018 ,因此您需要确保将ecmaVersion设置为至少9

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM