新闻详情

新闻详情

首页 / 资讯中心 / 详情

Lore 中的 glob-match:线性时间通配符匹配库及其 `**` 回溯缺陷修复

发布时间:2026/9/25 3:00:26来源:尧图网络
Lore 中的 glob-match:线性时间通配符匹配库及其 `**` 回溯缺陷修复
版本控制后端【免费下载链接】loreLore is a next-generation, open source version control system项目地址https://gitcode.com/gh_mirrors/lore6/lore点击查看免费下载本篇介绍 Lore 仓库通过vendor目录本地化vendoring引入的glob-match通配符匹配库它的语法、两个核心 API 的用法以及 Lore 团队在0.2.1版本中发现并修复的**globstar回溯缺陷。读完后你将理解 gitignore 风格过滤为何依赖正确的**语义以及 Lore 如何用一条低开销的“确认回退路径”在不改动上游状态机的前提下补齐了遗漏的匹配。glob-match 是什么glob-match 是一个高性能的 glob 通配符匹配库支持通配符、字符类和大括号展开。它的设计目标是把匹配开销压到最低核心特性包括线性时间匹配不存在指数级回溯零分配匹配过程不产生堆分配无正则编译匹配直接在 glob 模式串的原位进行matching occurs on the glob pattern in place支持捕获通配符匹配到的区间可把模式中的动态部分从路径字符串中切出来数以千计的测试用例基于 Bash 与 micromatch 的行为。在 Lore 中它被 vendored 到 vendor/glob-match并通过工作区根 Cargo.toml 的[patch.crates-io]段把 crates.io 上的glob-match 0.2.1重定向到本地目录。根 Cargo.toml 的注释直接点明动机Fixes a**backtracking defect that made the filter silently under-exclude; see vendor/glob-match/Cargo.toml.也就是说Lore 的过滤逻辑gitignore 文档、view filter会原样接受**这类 gitignore 语法上游库的一个**缺陷会让 Lore 静默漏排除路径因此必须本地化并修正。语法Lore 过滤器实际接受的通配符语义README 中的语法表完整继承了 Bash/micromatch 的常见约定这也是 Lore 过滤层向用户暴露的语义语法含义?匹配任意单个字符*匹配零个或多个字符但不跨路径分隔符如/**匹配零个或多个字符包括路径分隔符必须作为一个完整的路径段出现后面跟/或模式结束[ab]匹配方括号内的任一字符支持范围如[a-z]用[!ab]或[^ab]表示取反{a,b}匹配大括号内的某个子模式子模式可使用任意通配符大括号最多嵌套 10 层!位于模式开头时取反整个匹配结果多个!会多次取反\反斜杠可转义上述任一特殊字符其中**的“必须构成完整路径段”一条在实现里有明确体现src/lib.rs 中只有当**前面是模式起点或/、且后面紧跟/或模式结束时才被当作真正的 globstar 处理这使得a/**/b能匹配a/b中间段整体可选却不会让a**b这类写法获得 globstar 语义。两个核心 API基础匹配glob_match最直接的用法是一个布尔判断use glob_match::glob_match; assert!(glob_match(some/**/{a,b,c}/**/needle.txt, some/path/a/to/the/needle.txt));Lore 的过滤层正是这样调用它的。在 lore-revision/src/filter.rs 的step方法中过滤规则逐行推进每一行非字面量规则都会调用glob_match::glob_match(line.glob.as_str(), to_match)判定命中命中后该行的negated标志决定路径最终是被排除还是被重新纳入。测试 lore-revision/tests/filter_gitignore.rs 还展示了 gitignore 语义的一个常用变体glob_match(glob, file) || glob_match(format!({glob}/**), file)即用“原模式”或“原模式加/**”的或运算来覆盖 gitignore 中目录模式的两种解释。捕获匹配glob_match_with_captures第二个 API 返回模式中动态部分在路径串里对应的区间方便把通配符实际匹配到的内容切出来use glob_match::glob_match_with_captures; let glob some/**/{a,b,c}/**/needle.txt; let path some/path/a/to/the/needle.txt; let result glob_match_with_captures(glob, path) .map(|v| v.into_iter().map(|capture| path[capture]).collect()); assert_eq!(result, vec![path, a, to/the]);captures是VecRangeusize每个区间对应一个通配部分在路径串中的起止位置对区间切片即可得到path、a、to/the这三段被**/{a,b,c}吸收的内容。匹配不上时返回None。从 src/lib.rs 可以看到捕获版本只是给同一个glob_match_internal传入了一个 captures 缓冲区区间状态保存在State结构体的capture_index字段中随*/**的回溯同步回滚。实现要点单遍状态机 回退栈glob_match_internalsrc/lib.rs是一个双指针状态机注释注明算法源自 research.swtch.com/glob 的经典线性 glob 算法State保存path_index/glob_index两个指针、捕获索引以及wildcard和globstar两个回退点回退点刻意用u32而非usize存储源码注释说明这能带来约 10% 的性能收益src/lib.rs大括号展开用一个固定 10 深度的BraceStack保存每个分支的进入状态支持最多 10 层嵌套遇到*时记录回退点遇到**时合并连续的**段并单独维护 globstar 回退点字面字符失配时先尝试state.backtrack()回到最近的*重试再尝试切换大括号分支。README 给出的基准数据量级为glob_match单次匹配约 180 ns对比glob的 ~340 ns 与globset的 ~35 µs这也解释了为什么 Lore 把这样一个热路径上逐行、逐路径调用的匹配器做成分布式过滤遍历需要对每个候选路径逐条规则求值。Lore 的修正**回溯缺陷与 doublestar 确认路径缺陷长什么样上游 0.2.1 的缺陷在 vendored 版本里被明确注释记录。当模式形如**/含通配符的段时快速路径会在第一个字面量字符匹配成功、把 globstar 回退点“提交”state.globstar.path_index 0之后再无法恢复于是**已经“走过”的路径段永远不会被重新吸收。后果是**/*b不匹配b/b但匹配x/b**/*/a不匹配d/a。匹配结果取决于**吸收段的名字这本身就是错误的信号——同一个模式、同构的路径只是段名不同判定却不一样。提交该缺陷位置在 src/lib.rs 的注释写得很直白“this commit is irreversible, and that is the**backtracking defect”。修复策略保留上游状态机只补一条确认路径Lore 的选择是不改上游状态机的任何一步而是在公共入口 glob_match 外面加一层判定pub fn glob_match(glob: str, path: str) - bool { if glob_match_internal(glob, path, None) { return true; } if doublestar::may_be_missed(glob.as_bytes()) doublestar::is_plain_path(path.as_bytes()) { return doublestar::matches(glob.as_bytes(), path.as_bytes()); } false }三个设计点值得注意快速路径的否定结论才是可信需要复核的部分glob_match_internal可能漏判miss a match但从不会误报一个不存在的匹配所以只有当它返回false且模式确实可能触发缺陷时才付出第二遍的代价。may_be_missed做廉价前置筛选src/lib.rs先用字节扫描确认模式里根本没有**就直接返回false绝大多数 glob 不含**再排除花括号展开、前导!和转义——这些是确认匹配器未实现的构造而 Lore 的过滤器不会产生它们gitignore 语法本身也没有花括号语法。命中缺陷形状**之后还跟着含通配符的段才放行。doublestar::matches是分组件的动规划分器src/lib.rs把模式与路径都按/切成组件列表用一条reachable布尔行做原地更新的可达性传播。**可以吸收任意多个组件但每个(模式组件, 路径组件)组合只决策一次因此是多项式时间而非朴素递归的指数时间。组件级的component匹配则退化为经典的双指针带*回退的线性匹配并复用与快速路径一致的字符类规则含[!...]/[^...]取反与a-z范围。边界对齐确认匹配器刻意与快速路径保持同一组边角行为——尾部的**要求至少剩余一个组件对应 gitignore “trailing/**匹配其内部一切”的语义其余位置的**可以吸收零个组件所以a/**/b匹配a/b含空组件的路径前导、尾随或双分隔符则直接拒绝让快速路径的结论维持原判因为仓库内相对路径本就是规整过的。vendor/glob-match/Cargo.toml 的头部注释把整件事概括为一句话并提醒“Upstream this”这是从 crates.io 0.2.1MIT, Devon Govett拉下来、只为修**回溯缺陷的 vendored 副本bench 及其 dev-dependencies 被移除只保留库本身。回归测试判定不能取决于**吸收了什么名字tests/doublestar.rs 是随修复加入的测试其核心思想是“无参照实现的判定法”每个用例都是同一模式对两条无法区分的路径——模式的分解完全相同只有**吸收段的拼写不同。若匹配器对两者给出不同答案必有一错因此不需要外部参照实现即可断言。测试覆盖了三个方向修复生效**/*b对x/b与b/b都为truea/**/*.tmp对a/q/y.tmp与a/x.tmp/y.tmp都为true上游对每对中的第一个返回false没有放宽模式上游原本就判false的用例保持false例如**/*b对b/a、a/**/b对a/bb**是整段不能吞掉bb的一部分、a/**对a尾部**需要自己的段不受影响的形状**后面全是字面量如**/foo从未到达缺陷点仅由快速路径作答。小结glob-match在 Lore 中的角色是“热路径上的过滤判定器”它把 gitignore/view 过滤文档中逐字接受的通配符语法?、*、**、[ab]、{a,b}、!、\落到每次路径遍历的每一步上性能以纳秒计。Lore 对其做的本地化修正展示了开源项目中一种务实的依赖治理方式不动上游算法只在边界处加一条仅对已知缺陷形状生效的多项式确认路径并以“同构路径判定一致性”为锚点编写自洽的回归测试从而在不引入二次维护成本的前提下让过滤器的排除语义严格对齐 gitignore 文档承诺的行为。赞分享版本控制后端【免费下载链接】loreLore is a next-generation, open source version control system项目地址https://gitcode.com/gh_mirrors/lore6/lore点击查看免费下载相关推荐micromatch高性能的通配符与 glob 匹配库micromatch高性能的通配符与 glob 匹配库 micromatch 是一个专为 JavaScript/Node.js 设计的高度优化的通配符和 gl开发工具kubesphere 项目中的 Go 通配符匹配库 gobwas/glob 深入解析kubesphere 项目中的 Go 通配符匹配库 gobwas/glob 深入解析 导读 github.com/gobwas/glob 是一个专为 Go 语云原生容器编排后端微服务多集群DevOps可观测性AI 技能tiny-glob: 极速简易的通配符匹配工具tiny glob: 极速简易的通配符匹配工具 项目介绍 tiny glob 是一个轻量级且响应迅速的 globbing 解决方案专为 Node.js 设计。上一篇Data Engineer Handbook数据工程GitLab CI使用指南下一篇把PS3跑起来RPCS3模拟器10分钟上手手册创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Claude Code 模板化实战:从 CLAUDE.md 到团队级 AI 工作流 2026/9/25 3:43:29

Claude Code 模板化实战:从 CLAUDE.md 到团队级 AI 工作流

1. 模板化逻辑:Claude Code 真正威力不在对话,而在记忆与工作流Claude Code 是 Anthropic 推出的命令行 AI 编程助手,它最值得关注的特性不是能聊天、能改代码,而是可以通过项目模板建立一套可持续复用的上下文体系。很多人第一次…

阅读更多 →
XAgent 内环 ReACT 链式搜索深度解析:ReACTChainSearch 如何驱动子任务逐步执行 2026/9/25 3:43:29

XAgent 内环 ReACT 链式搜索深度解析:ReACTChainSearch 如何驱动子任务逐步执行

AI Agent大模型后端任务调度 【免费下载链接】XAgent An Autonomous LLM Agent for Complex Task Solving 项目地址: https://gitcode.com/gh_mirrors/xa/XAgent 点击查看 免费下载 本文基于 XAgent 仓库中 ReACT.md 文档及其对应源码 ReACT.py,系统讲解…

阅读更多 →
作业批改系统实战:从OCR图像识别到判分规则全流程解析 2026/9/25 3:43:29

作业批改系统实战:从OCR图像识别到判分规则全流程解析

简介:作业批改系统是一套面向教学场景的多角色Web应用源码,完整覆盖学生、教师、管理员三类账号的功能闭环。学生端包含注册登录、点卡充值、个人信息维护、作文上传与上传管理、请求老师批改及批改结果查询;教师端可在线批改作文、获取点数并…

阅读更多 →
BewlyBewly Adapted Styles 开发指南:编写深色模式与主题色适配样式的规范与实践 2026/9/25 3:43:29

BewlyBewly Adapted Styles 开发指南:编写深色模式与主题色适配样式的规范与实践

前端 【免费下载链接】BewlyBewly Just make a few small changes to your Bilibili homepage. (English | 简体中文 | 正體中文 | 廣東話) 项目地址: https://gitcode.com/gh_mirrors/be/BewlyBewly 点击查看 免费下载 导读:BewlyBewly 是一个对 Bilib…

阅读更多 →
16种常见电子元器件实物识别图解与使用场景一览 2026/9/25 3:43:28

16种常见电子元器件实物识别图解与使用场景一览

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
使用 Accelerate 微调 (m)LUKE 进行 Token 分类任务:NER、POS 与 Chunking 实战指南 2026/9/25 3:43:22

使用 Accelerate 微调 (m)LUKE 进行 Token 分类任务:NER、POS 与 Chunking 实战指南

推理引擎大模型 【免费下载链接】FlexGen Running large language models on a single GPU for throughput-oriented scenarios. 项目地址: https://gitcode.com/gh_mirrors/fl/FlexGen 点击查看 免费下载 LUKE(Language Understanding with Knowledge-…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉