{}和+之间的全局模式差异

问题描述

我引用了https://facelessuser.github.io/wcmatch/glob/,并说了

+(pattern_list):如果pattern_list中的任何一个或多个模式匹配输入字符串,则该模式匹配。 需要EXTGLOB标志。

{}:Bash样式括号扩展。这适用于之前的模式 还要别的吗。需要BRACE标志。

我可以看到每个描述都不相同,但实际示例很难理解。

例如,下面的两个有什么区别?

"lint-staged": {
    "src/**/*.{js,jsx,ts,tsx,json,css}": [
        "prettier --write","eslint --fix src/","tslint --fix --project .","git add"
    ]
},"lint-staged": {
    "src/**/*.+(js|jsx|ts|tsx|json|css)": [
        "prettier --write",

任何建议将不胜感激!

解决方法

{}实现了与Bash大括号扩展类似的功能。本质上src/**/*.{js,jsx,ts,tsx,json,css}将变为:

[
    'src/**/*.js','src/**/*.jsx','src/**/*.ts','src/**/*.tsx','src/**/*.json','src/**/*.css'
]

有一个时间和地点,但是您可能会发现这样做效率较低,因为您现在正在处理多个模式。

您可以更像正则表达式来思考+(),其中+(js|jsx|ts|tsx|json|css)会更等效于(js|jsx|ts|tsx|json|css)+。 因此它可以匹配jsjsjsxtxjson之类的东西,但实际上并不等同于{}

如果想与{}进行更有效的比较,您可能感兴趣的是@(js|jsx|ts|tsx|json|css),它等效于像(js|jsx|ts|tsx|json|css)这样的正则表达式模式,该模式只匹配一个且匹配js但不匹配jsjsxtxjson。之所以更有效,是因为您得到的是单一模式而不是多个模式。