glob · 文件路径的迷你匹配语言
**/*.test.ts、files.exclude 里的 **/node_modules、.gitignore 里的 dist/ —— 写配置时天天在用的这种「带星号的路径」叫 glob pattern。它不是正则:为「文件路径」这种 用 / 分段的字符串量身定做,规则不多,但有几条高频易错的语义—— * 不跨 /、dotfile 默认不命中、** 必须单独成段才有跨段语义。本系列把每条规则做成可动手验证的 demo:全部匹配都由本仓库的真实实现 @vega/parsing/glob 驱动,第 05 页 (引擎) 直接拆开它的管线—— glob AST 怎么转译成 regex、再交给 @vega/parsing/regex 引擎执行。阅读 05 页前建议先了解 regex 系列的基础语法。
一句话入门:
**/*.{ts,tsx} 这一条的结构就够了—— **/ 管「任意层目录」,* 管「段内任意文件名」,{a,b} 管「多选一」。其余各页讲的是它们的精确语义与各工具的差异。星号、问号与字符集:一段之内怎么配
glob 的三个基本通配:* 段内任意、? 单字符、[...] 字符集,以及它们为何都不跨路径分隔符。
globstar:跨目录通配
** 单独成段时匹配零个或多个路径段;与字面量混写则退化为普通 *,各实现在这一点上并不一致。
brace 多选一与 extglob 方言差异
花括号一条 pattern 多选一,转译后成为正则分支;extglob 的带量词分组则是 bash 与 minimatch 的扩展。
dotfile 规则与「排除」的三种写法
通配默认不匹配以点开头的段;「排除」在 node-glob、gitignore 与 VS Code 里是三套完全不同的表达。
真实管线:parseGlob → AST → regex 源串 → 引擎执行
拆开本仓库 glob 实现的管线:分词、AST、转译成正则、执行,以及不经正则的双指针写法。
速查表:语法 · 工具差异 · 常用配方 · 易错点
glob 的语法总表、五家实现的差异对照,以及一组常用 pattern 配方。
和别的系列串起来看:
* 回溯单步和 字符串匹配里的暴力对齐一脉相承;而「pattern → 状态机」的视角见 有限自动机。🔗 相关链接
📐 规范 / 权威实现
-
glob(7) · Linux man-pages
· man7.org
glob 没有单一官方规范,这份 man page 覆盖的是最基础的一层:
* ? [...]的精确语义、不跨/与 dotfile 规则,本系列 01 / 04 页的口径与它一致。**与{a,b}都在它之外,属各家方言;它讲的 POSIX 命名字符类本仓库实现亦未收录。 -
picomatch
· github.com
被 Jest / rollup / chokidar 等数百万项目依赖的 JS glob 匹配内核,把 pattern 编译成 RegExp。它和 minimatch 是「glob → 正则」这条路线的两个权威实现,05 页讲的
@vega/parsing/glob同属此列。
🧭 延伸阅读
-
Glob Patterns Reference
· code.visualstudio.com
VS Code 官方的 glob 语法参考:
files.exclude/search.exclude/ 文件关联里各支持什么、大小写敏感性规则。本系列 01 / 02 / 04 页的语法口径与它对照。 -
node-glob
· github.com
JS 世界的标准 glob 实现 (npm 周下载量数亿),README 的「Glob Primer」是最好的语义讲义:dot 规则、
**与 symlink、Windows 路径、全套 options。本系列的匹配语义对齐它的主干。 -
minimatch
· github.com
node-glob 体内的匹配内核:把 glob 编译成 RegExp 的真实工程实现,05 页讲的
@vega/parsing/glob走的正是同一条路线。 -
gitignore 文档
· git-scm.com
最常被混淆的「glob 方言」:尾随
/表目录、!重新包含、无/的 pattern 在任意层生效——和 node-glob 的差异见 04 / 06 页。 -
Bash Manual · Pattern Matching
· gnu.org
glob 的源头:shell 文件名展开的权威定义,extglob 五种形式与
globstar选项都在这。 - Globster · glob 在线试验场 · globster.xyz 输入 pattern 与一棵文件树,实时看命中——和本系列 02 页同款交互,适合拿真实项目的文件清单去试。