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)用于筛选需要进行插桩的文件。

浙公网安备 33010602011771号