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 的基础:* 零或多个字符、? 恰好一个、[0-9] / [!0-9] 字符集。关键约束:它们全都不跨 /——所以 *.js 配不到 lib/app.js。实时匹配器逐条点亮命中文件名。
**:跨目录通配
** 单独成段时匹配零个或多个路径段:**/*.md 连根目录的也命中,src/** 连 src 自身也算。与字面量混写 (a**b) 则退化为普通 *。在一棵项目文件树上换 pattern 实时看命中范围伸缩。
brace 多选一与 extglob 方言差异
*.{js,ts} 等价于 *.js 与 *.ts 两条 pattern——实时查看嵌套 {a,b{1,2}} 的等价展开、笛卡尔积的条数增长,以及本仓库实现转译出的 (?:a|b)。再对照 bash 系的 extglob 五种形式 @( ) ?( ) +( ) *( ) !( ) 与 {1..3} 数字区间:它们是 bash / minimatch 的扩展,本仓库实现未收录。
dotfile 规则与「排除」的三种写法
为什么 * 匹配不到 .env、** 不进 .git/?dot 规则一页讲清。再对比三家「排除」语法:node-glob 用 ignore 选项(不认 ! 前缀)、gitignore 用 ! 重新包含、VS Code 用 files.exclude 对象。树上实测 ignore 把命中划掉。
真实管线:parseGlob → AST → regex 源串 → 引擎执行
本仓库 @vega/parsing/glob 的完整实现:pattern 先解析成 GlobAst,再转译成 ^…$ 锚定的 regex 源串(* → [^/]*、dot 守卫 (?!\.)、** → 跨段形态),交给 @vega/parsing/regex 引擎执行。实时查看 AST 与转译产物,错误输入展示 message + pos;再单步演示 * 回溯的经典双指针算法。
速查表:语法 · 工具差异 · 常用配方 · 易错点
一页备查:全部语法一张表(标注本仓库实现的支持范围);bash / node-glob / VS Code / .gitignore 与 @vega/parsing/glob 的差异对照(extglob 谁认、否定怎么写、大小写敏感性);**/*.{ts,tsx} 等常用配方点一下就在树上试;Windows 反斜杠、[] 转义等易错点清单。
和别的系列串起来看:
* 回溯单步和 字符串匹配里的暴力对齐一脉相承;而「pattern → 状态机」的视角见 有限自动机。🔗 相关链接
📐 规范 / 权威实现
-
glob(7) · Linux man-pages
· man7.org
glob 没有单一官方规范,这份 man page 是最接近权威定义的来源:
* ? [...]的精确语义、不跨/、dotfile 规则、POSIX 命名字符类,本系列 01 / 04 页的口径与它一致。 -
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 页同款交互,适合拿真实项目的文件清单去试。