glob模式

来源:互联网 发布:mac关闭访客 编辑:程序博客网 时间:2024/06/15 03:28

glob最早是出现在类Unix系统的命令行中, 是用来匹配文件路径的。比如,lib/**/*.js 匹配 lib 目录下所有的 js 文件。
除了在命令行中,我们在程序中也会有匹配文件路径的需求。于是,很多编程语言有了对 glob 的实现 ,如 Python 中的 glob 模块; php 中的 glob 方法。

其语法如下:

通配符描述例子匹配不匹配*匹配任意数量的字符包括空字符Law*Law, Laws, or Lawyer
*Law*Law, GrokLaw, or Lawyer.
?匹配任意一个字符?atCat, cat, Bat or batat[abc]匹配任意一个包含的字符[CB]atCat or Batcat or bat[a-z]匹配任意一个给定范围的字符Letter[0-9]Letter0, Letter1 etc.Letters or Letter

注意,在所有以上例子中路径分隔符(unix的/,windows的\)都不会被匹配。

在Linux和POSIX系统中[…]有以下两个扩展:

通配符描述例子匹配不匹配[!abc]不匹配任意一个包含的字符[!C]atBat, bat, or catCat[!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,bbbabc.bcd?(pattern|pattern)匹配至多一个()内的pattern?(abc|bcd)abcbbb+(pattern|pattern)匹配至少一个()内的pattern+(abc|bcd)abcbbb*(pattern|pattern)匹配任意个()内的pattern*(abc|bcd)abcbbb@(pattern|pattern)精确匹配()内的其中一个pattern@(abc|bcd)abcabd