# glob模式
在学习gulp的过程中,gulp使用了被称作为glob的文件匹配模式。
接下来我们认识下什么是glob模式。
在计算机编程中,特别是类Unix环境,glob模式通过通配符来匹配文件名。例如:Unix命令,将所有以扩展名为 .txt 的文件从当前目录拷贝到 textfiles 目录。
mv *.txt textfiles/
1
这里 * 是一个匹配任意数量字符基本通配符,*.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 |