← 首页 / glob · 文件路径的迷你匹配语言 待审核 6 页

glob · 文件路径的迷你匹配语言

**/*.test.tsfiles.exclude 里的 **/node_modules.gitignore 里的 dist/ —— 写配置时天天在用的这种「带星号的路径」叫 glob pattern。它不是正则:为「文件路径」这种 / 分段的字符串量身定做,规则不多,但有几条高频易错的语义—— * 不跨 /dotfile 默认不命中** 必须单独成段才有跨段语义。本系列把每条规则做成可动手验证的 demo:全部匹配都由本仓库的真实实现 @vega/parsing/glob 驱动,最后一页 (05 · 引擎) 直接拆开它的管线—— glob AST 怎么转译成 regex、再交给 @vega/parsing/regex 引擎执行。阅读 05 页前建议先了解 regex 系列的基础语法。

一句话入门:

日常写 glob,记住 **/*.{ts,tsx} 这一条的结构就够了—— **/ 管「任意层目录」,* 管「段内任意文件名」,{a,b} 管「多选一」。其余各页讲的是它们的精确语义与各工具的差异。 01 · 单段通配

* / ? / [...]:一段之内怎么配

glob 的基础:* 零或多个字符、? 恰好一个、[0-9] / [!0-9] 字符集。关键约束:它们全都不跨 /——所以 *.js 配不到 lib/app.js。实时匹配器逐条点亮命中文件名。

02 · globstar

**:跨目录通配

** 单独成段时匹配零个或多个路径段:**/*.md 连根目录的也命中,src/**src 自身也算。与字面量混写 (a**b) 则退化为普通 *。在一棵项目文件树上换 pattern 实时看命中范围伸缩。

03 · {} 与 extglob

brace 多选一与 extglob 方言差异

*.{js,ts} 等价于 *.js*.ts 两条 pattern——实时查看嵌套 {a,b{1,2}} 的等价展开、笛卡尔积的条数增长,以及本仓库实现转译出的 (?:a|b)。再对照 bash 系的 extglob 五种形式 @( ) ?( ) +( ) *( ) !( ){1..3} 数字区间:它们是 bash / minimatch 的扩展,本仓库实现未收录。

04 · dotfile 与 ignore

dotfile 规则与「排除」的三种写法

为什么 * 匹配不到 .env** 不进 .git/?dot 规则一页讲清。再对比三家「排除」语法:node-glob 用 ignore 选项(不认 ! 前缀)、gitignore 用 ! 重新包含、VS Code 用 files.exclude 对象。树上实测 ignore 把命中划掉。

05 · 引擎

真实管线:parseGlob → AST → regex 源串 → 引擎执行

本仓库 @vega/parsing/glob 的完整实现:pattern 先解析成 GlobAst,再转译成 ^…$ 锚定的 regex 源串(*[^/]*、dot 守卫 (?!\.)** → 跨段形态),交给 @vega/parsing/regex 引擎执行。实时查看 AST 与转译产物,错误输入展示 message + pos;再单步演示 * 回溯的经典双指针算法。

06 · 速查与差异

速查表:语法 · 工具差异 · 常用配方 · 易错点

一页备查:全部语法一张表(标注本仓库实现的支持范围);bash / node-glob / VS Code / .gitignore 与 @vega/parsing/glob 的差异对照(extglob 谁认、否定怎么写、大小写敏感性);**/*.{ts,tsx} 等常用配方点一下就在树上试;Windows 反斜杠、[] 转义等易错点清单。

和别的系列串起来看:

glob 引擎那页的「转译成 regex」正对接 regex 系列的语法页—— glob 本质是一门刻意收窄的正则子集(没有无界回溯,所以不怕 ReDoS),它的 * 回溯单步和 字符串匹配里的暴力对齐一脉相承;而「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 页同款交互,适合拿真实项目的文件清单去试。