ESLint 和回顾断言
ESLint and lookbehind assertion
我有一个正则表达式,其中包含 ESLint 似乎无法识别为有效的回顾断言。但是前瞻断言很好。
我可以用最新版本的 ESLint(我用过 online demo)和非常简单和人为的例子重现这个问题。
先行断言:匹配 b
(且仅 b
)如果后跟 d
:
'bd'.match(/b(?=d)/) //=> ['b']
'be'.match(/b(?=d)/) //=> null
ESLint 将 /b(?=d)/
识别为有效的正则表达式:
Lookbehind 断言:匹配 b
(且仅 b
),前提是 a
:
'ab'.match(/(?<=a)b/) //=> ['b']
'eb'.match(/(?<=a)b/) //=> null
ESLint 无法将 /(?<=a)b/
识别为有效的正则表达式:
问题:我的正则表达式有什么问题导致 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": {}
}
可以参考Specifying Parser Options参考:
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.
可以看到,默认值为5
,表示只支持ES5。 Lookbehinds 是 compliant with ECMAScript 2018,因此您需要确保将 ecmaVersion
设置为至少 9
:
"parserOptions": {
"ecmaVersion": 9,
"sourceType": "script",
"ecmaFeatures": {}
},
我有一个正则表达式,其中包含 ESLint 似乎无法识别为有效的回顾断言。但是前瞻断言很好。
我可以用最新版本的 ESLint(我用过 online demo)和非常简单和人为的例子重现这个问题。
先行断言:匹配 b
(且仅 b
)如果后跟 d
:
'bd'.match(/b(?=d)/) //=> ['b']
'be'.match(/b(?=d)/) //=> null
ESLint 将 /b(?=d)/
识别为有效的正则表达式:
Lookbehind 断言:匹配 b
(且仅 b
),前提是 a
:
'ab'.match(/(?<=a)b/) //=> ['b']
'eb'.match(/(?<=a)b/) //=> null
ESLint 无法将 /(?<=a)b/
识别为有效的正则表达式:
问题:我的正则表达式有什么问题导致 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": {}
}
可以参考Specifying Parser Options参考:
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.
可以看到,默认值为5
,表示只支持ES5。 Lookbehinds 是 compliant with ECMAScript 2018,因此您需要确保将 ecmaVersion
设置为至少 9
:
"parserOptions": {
"ecmaVersion": 9,
"sourceType": "script",
"ecmaFeatures": {}
},