title: gulp路徑的匹配規(guī)則
date: 2017-06-05 15:51:14
tags: gulp 正則匹配
gulp匹配規(guī)則
Gulp使用 node-glob 模塊佃延,借助 minimatch 庫搪泳,將glob表達式(glob expressions)轉(zhuǎn)換成JavaScript正則表達式(JavaScript RegExp) ,從而實現(xiàn)文件匹配功能结缚。我們所看到的 **
和 *
都是其所提供的語法:
*
匹配文件路徑中的0個或多個字符竿痰,但不會匹配路徑分隔符脆粥,除非路徑分隔符出現(xiàn)在末尾。
**
匹配路徑中的0個或多個目錄及其子目錄影涉,需要單獨出現(xiàn)变隔,即它左右不能有其他東西了。如果出現(xiàn)在末尾蟹倾,也能匹配文件匣缘。
?
匹配文件路徑中的一個字符(不會匹配路徑分隔符)。
[...]
匹配方括號中出現(xiàn)的字符中的任意一個鲜棠,當方括號中第一個字符為 ^
或 !
時肌厨,則表示不匹配方括號中出現(xiàn)的其他字符中的任意一個。
!(pattern|pattern|pattern)
匹配任何與括號中給定的任一參數(shù)一致的都不匹配的豁陆。
?(pattern|pattern|pattern)
匹配括號中給定的任一參數(shù)0次或1次柑爸。
+(pattern|pattern|pattern)
匹配括號中給定的任一參數(shù)至少1次。
*(a|b|c)
匹配括號中給定的任一參數(shù)0次或多次献联。
@(pattern|pat*|pat?erN)
匹配括號中給定的任一參數(shù)1次竖配。
用實例來加深理解:
*
能匹配 a.js
, x.y
, abc , abc/
何址,但不能匹配 a/b.js
*.*
a.js
style.css
a.b
x.y
*/*/*.js
a/b/c.js
x/y/z.js
a/b.js
a/b/c/d.js
**
能匹配 abc
, a/b.js
, a/b/c.js
, x/y/z
, x/y/z/a.b
里逆,能用來匹配所有的目錄和文件
**/*.js
foo.js
a/foo.js
a/b/foo.js
a/b/c/foo.js
a/**/z
a/z
a/b/z
a/b/c/z
a/d/g/h/j/k/z
a/**b/z
能匹配 a/b/z , a/sb/z
,但不能匹配 a/x/sb/z
用爪,因為只有單 **
單獨出現(xiàn)才能匹配多級目錄
?.js
a.js
b.js
c.js
a??
能匹配 a.b
, abc
原押,但不能匹配 ab/
,因為它不會匹配路徑分隔符
[xyz].js
只能匹配 x.js
, y.js
, z.js
偎血,不會匹配 xy.js
, xyz.js
等诸衔,整個中括號只代表一個字符
[^xyz].js
能匹配 a.js
, b.js
, c.js
等,不能匹配 x.js
, y.js
, z.js
當有多種匹配模式時可以使用數(shù)組:
// 使用數(shù)組的方式來匹配多種文件
gulp.src(['js/*.min.js','sass/*.min.css'])
使用數(shù)組的方式還有一個好處就是可以很方便的使用排除模式颇玷,在數(shù)組中的單個匹配模式前加上 !
即是排除模式笨农,它會在匹配的結果中排除這個匹配,要注意一點的是不能在數(shù)組中的第一個元素中使用排除模式:
// 使用數(shù)組的方式來匹配多種文件
gulp.src(['*.js','!b*.js']) // 匹配所有js文件帖渠,但排除掉以b開頭的js文件
gulp.src(['!b*.js',*.js]) // 不會排除任何文件谒亦,因為排除模式不能出現(xiàn)在數(shù)組的第一個元素中
此外,還可以使用展開模式。展開模式以花括號作為定界符份招,根據(jù)它里面的內(nèi)容切揭,會展開為多個模式,最后匹配的結果為所有展開的模式相加起來得到的結果锁摔。展開的例子如下:
a{b,c}d
abd,acd
a{b,}c
abc,ac
a{0..3}d
a0d
a1d
a2d
a3d
a{b,c{d,e}f}g
abg
acdfg
acefg
a{b,c}d{e,f}g
會展開為 abdeg
, acdeg
, abdeg
, abdfg
6. 注意事項(Attention)
- watch 的時候路徑不要用 './path'廓旬,直接使用 '/path' 即可不然會導致新增文件無法被 watch。
- gulp 對于 one after one 的任務鏈谐腰,需要加 return孕豹,比如 gulp clean