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)用於篩選需要進行插樁的文件。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章