前言
在本文中我將以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)用於篩選需要進行插樁的文件。