Glob模式匹配
前言
在本文中我将以glob是什么,glob的语法,glob与正则表达式的差异等几个方面对glob模式匹配进行一个梳理,希望也能对读者起到一定的帮助。
glob 是什么
glob是用于文件名的一种模式匹配,全程global
,起源于贝尔实验室的 Unix 最早期的版本。后来,这项功能以库函数glob()的形式提供,被用于shell等程序。在日常使用bash命令时,经常用到的如ls *.txt
的命令就使用到了glob模式。
语法
分隔符和片段
概念:分隔符即为文件路径中的/
,而路径通过split('/')
得到数组的每一项即为片段。
示例:
app/src/**
有3个片段,分别为:app
,src
,**
基础语法
Glob 不匹配任何隐藏文件或文件夹。
通配符 | 描述 | 示例 | 匹配结果(部分) | 不匹配(部分) |
---|---|---|---|---|
* |
匹配单个片段中零或多个字符 | src/*.ts |
src/a.ts , src/ant.ts |
src/a/a.ts |
? |
匹配单个片段中的任意单个字符 | ?at |
cat , Bat |
at , tcat |
[abc] |
匹配单个片段的单个字符, 但字符需属于括号内的字符集合 | [AB]ct |
Act , Bct |
cct |
[a-z] |
匹配单个片段的单个字符,但字符需在括号内字符范围 | example[0-9] |
example0 , example1 |
example10 , examples |
[!abc] 或 [^abc] |
匹配单个片段的单个字符,但字符需不属于括号内的字符集合 | [!ab].js / [^ab].js |
c.js |
ab.js , a.js |
[!a-z] 或者[^a-z] |
匹配单个片段的单个字符,但字符需属于括号内字符范围 | example[!3-7] / example[^3-7] |
example2 , example1 |
example3 , example5 |
扩展语法
通配符 | 描述 | 示例 | 匹配结果(部分) | 不匹配(部分) |
---|---|---|---|---|
** |
匹配一个或多个片段(跨片段)中的零或多个字符 | app/src/** |
app/src/a,js , app/src/ab/c.js |
app/components/a.js |
{x,y, ...} |
匹配大括号内的所有模式,模式之间用逗号分隔,支持大括号嵌套,支持.. 匹配连续字符 |
{{a..b},c}.js |
a,js , b.js , c.js |
d.js , ab.js |
`?(pattern | pattern | pattern)` | 匹配0次或1次给定的模式 | `a.?(txt |
`*(pattern | pattern | pattern)` | 匹配0次或多次给定的模式 | `a.*(txt |
`+(pattern | pattern | pattern)` | 匹配1次或多次给定的模式 | `a.+(txt |
`@(pattern | pattern | pattern)` | 严格匹配给定的模式 | `a.@(txt |
`!(pattern | pattern | pattern)` | 匹配非给定的模式 | `a.!(txt |
与 regexp 的差异
glob模式主要用于匹配文件路径,也可匹配字符串,不过能力比regexp弱。需要注意的是,glob模式的许多元字符和regexp相同,但含义却是不同的。
glob | regexp | 精确的 regexp |
---|---|---|
* |
.* |
^(?!\.)[^\/]*?$ |
? |
. |
^(?!\.)[^\/]$ |
[a-z] |
[a-z] |
^[a-z]$ |
glob 匹配的是整个字符串,而 regexp 默认匹配的是子串,regexp 如果要匹配整个字符串需显式指定^和$。
应用场景
glob最常见的应用场景就是匹配文件路径,在代码覆盖率istanbul
中就使用了glob模式(test-exclude)用于筛选需要进行插桩的文件。