在學習gulp的過程中,gulp使用了被稱作為glob的文件匹配模式。
接下來我們認識下什么是glob模式。
在計算機編程中,特別是類Unix環境,glob模式通過通配符來匹配文件名。例如:Unix命令,將所有以擴展名為.txt的文件從當前目錄拷貝到textfiles目錄。
1
|
mv *.txt textfiles/
|
這里【*】是一個匹配任意數量字符基本通配符,*.txt就表示一個glob模式。另一個通用的通配符是【?】,它表示任意一個字符。
最常用的通配符是 *,?,[…]:
通配符 | 描述 | 例子 | 匹配 | 不匹配 |
---|---|---|---|---|
* | 匹配任意數量的字符包括空字符 | Law* | Law, Laws, or Lawyer | |
*Law* | Law, GrokLaw, or Lawyer. | |||
? | 匹配任意一個字符 | ?at | Cat, cat, Bat or bat | at |
[abc] | 匹配任意一個包含的字符 | [CB]at | Cat or Bat | cat or bat |
[a-z] | 匹配任意一個給定范圍的字符 | Letter[0-9] | Letter0, Letter1 etc. | Letters or Letter |
注意,在所有以上例子中路徑分隔符(unix的/,windows的\)都不會被匹配。
在Linux和POSIX系統中[…]有以下兩個擴展:
通配符 | 描述 | 例子 | 匹配 | 不匹配 |
---|---|---|---|---|
[!abc] | 不匹配任意一個包含的字符 | [!C]at | Bat, bat, or cat | Cat |
[!a-z] | 不匹配任意一個給定范圍的字符 | Letter[!3-5] | Letter1, Letter2 etc. | Letter3, Letter4 or Letter5 |
與正則的比較:
Glob的通配符 | 等價正則的表達式 |
---|---|
? | . |
* | .* |
Glob嘗試匹配整個字符串(例如,S*.DOC將匹配S.DOC和SA.DOC,但不匹配POST.DOC或SURREY.DOCKS),正則只匹配子串除非使用^和$。所以S*.DOC的等價正則是^S.*\.DOC$。
node glob對常用通配符又做了一些擴展:
通配符 | 描述 | 例子 | 匹配 | 不匹配 |
---|---|---|---|---|
** | 匹配任意數量的字符包括空字符(包括路徑分隔符) | **/*.js | /a/b/c.js | |
!(pattern|pattern) | 匹配除了()內以外的pattern | !(abc|bcd) | aaa,bbb | abc.bcd |
?(pattern|pattern) | 匹配至多一個()內的pattern | ?(abc|bcd) | abc | bbb |
+(pattern|pattern) | 匹配至少一個()內的pattern | +(abc|bcd) | abc | bbb |
*(pattern|pattern) | 匹配任意個()內的pattern | *(abc|bcd) | abc | bbb |
@(pattern|pattern) | 精確匹配()內的其中一個pattern | @(abc|bcd) | abc | abd |