进阶实战:ad结构正则组合操作符详解(x/y/g/v/s/i/a/c/d)

发布时间:2026/10/11 2:04:26

进阶实战:ad结构正则组合操作符详解(x/y/g/v/s/i/a/c/d) 进阶实战ad结构正则组合操作符详解x/y/g/v/s/i/a/c/d【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/adad 文本编辑器结构正则的核心概念对于刚接触ad 文本编辑器的普通用户来说命令模式下的Edit表达式可能看起来像一条普通的 sed 替换命令但实际上它背后是一套完整的结构正则structural regex引擎。ad 借鉴了 Plan 9 系列编辑器的设计哲学将查找和编辑从单条表达式中解放出来允许你像写程序一样组合操作符一层层钻取文本结构。这篇文章将用最通俗的语言带你掌握 ad 结构正则中最常用的 9 个组合操作符x / y / g / v / s / i / a / c / d让你从会替换升级为会编程式地改文本。为什么需要结构正则而不是普通正则普通正则表达式擅长匹配一段连续文本但面对先按段落切分再在每个段落里找函数名最后只保留返回 Result 的函数这类多层任务时就力不从心了。结构正则组合操作符的思路完全不同你不再写一条大而全的正则而是描述一个查找过程——先用一个操作符粗粒度地划定范围再嵌套下一个操作符精确筛选。这套命令语言灵感来源于 Plan 9 文本编辑器 sam在 ad 中由 src/exec/mod.rs 模块负责解析与执行整个语法模型可以理解为操作符 正则 模板的自由组合。8 个操作符一图速查操作符含义一句话记忆x/re/遍历每个匹配选中所有匹配项y/re/遍历匹配之间的区域按正则切段g/re/过滤保留匹配只对命中的动手v/re/过滤剔除匹配只对没命中的动手i/template/在每个匹配前插入前缀a/template/在每个匹配后插入后缀c/template/用模板替换匹配替换s/re/template/替换等价于x/re/ c/template/快捷替换d删除匹配删除其中d是唯一不需要参数的无参操作符也是组合操作符语法里最特殊的一员——它在源码解析时被单独允许为无参数标签见 src/exec/mod.rs。逐个拆解每个操作符怎么用x/re/—— 遍历匹配结构正则的基石x是整套组合操作符体系中最核心的动作它在当前选区ad 里叫 dot范围内反复查找正则re每命中一次就执行嵌套在后面的动作。用官方教程里的例子Edit , x/mouse/ c/clicky thing/意思就是把所有 mouse 改成 clicky thing。注意s/re/template/其实是它的语法糖等价于x/re/ c/template/。y/re/—— 在匹配之间游走实现切分y与x相反它不选中匹配本身而是在相邻两个匹配之间的区域上执行动作。典型用途是按空行切分段落Edit 14,24 y/\n\n/ x/*occupation: programmer*/ x/name: (.*)/ p/{1} is a programmer\n/这条命令先按\n\n把文本切成若干块在每块里找 occupation 为 programmer 的段落再提取 name 字段并打印。这就是结构正则组合操作符的威力——一条命令完成切块→筛选→提取→输出四步。g/re/与v/re/—— 过滤开关gkeep只在匹配正则时执行后续动作vreject则相反。看项目自带的实战脚本 examples/scripts/result_fns.adx/fn*?\{/ # 选中所有函数签名 g/-.*Result.*\{/ # 只保留返回 Result 的函数 x/fn (\w)*?- (.*?) \{/ # 提取函数名与返回类型 p/({FILENAME}) {1} returns {2}\n/ # 按模板输出这个脚本能一键列出整个文件中返回 Result 的所有函数g在这里起到了filter的作用。i/template/、a/template/、c/template/—— 三种写入动作i在每个匹配之前插入模板文本a在每个匹配之后插入模板文本c用模板替换整个匹配模板里可以使用{1}、{2}引用正则捕获组甚至支持{FILENAME}、{ROW}、{COL}这类内置变量这在 examples/scripts/fancy_impl_blocks.ad 中有完整演示。d—— 一键删除d直接删除当前匹配是处理删掉所有空行这类需求的最快方式。由于它是无参操作符在组合表达式中常常作为链条的终点动作出现。进阶实战嵌套组合打造代码分析器理解了单个操作符后真正的乐趣在于嵌套。来看项目自带的 examples/scripts/impl_blocks.ad它用 20 行不到的脚本扫描整个 Rust 文件的 impl 块x/^(?:impl.*?|impl).*? (\w)*?^\}/ # 选定所有顶层 impl 块 { p/impl {1}\n/; # 打印 impl 的目标类型 x/fn*? (\w)/ p/ {1}\n/; # 嵌套遍历打印缩进的函数名 }而 examples/scripts/fancy_impl_blocks.ad 更进一步同时用g、v作为互斥守卫区分有返回类型和无返回类型两种情况还能识别mut self方法——这已经是小型静态分析工具的水平了。组合操作符的两种运行方式这些结构正则组合操作符既可以在 ad 编辑器内通过Edit命令实时执行也支持无界面的脚本模式docs/tour/structural-regex2ad -e $EDIT_SCRIPT # 直接传脚本字符串 ad -f script.ad file.txt # 从文件读取脚本并应用到目标文件也就是说你可以把上面的分析脚本保存为.ad文件批量处理任意源码文件实现命令行级的结构化文本处理。结语从替换到编程式编辑x / y / g / v / s / i / a / c / d这 9 个组合操作符看似简单但通过嵌套和分组它们足以表达大多数复杂的结构化文本编辑需求。建议你从 docs/tour/structural-regex 的入门示例开始再对照 examples/scripts/ 下的实战脚本逐行拆解很快你就能写出属于自己的结构正则处理管道。记住 ad 的核心哲学文本不只是被编辑的素材它本身就是可以执行的程序。【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/9 18:37:44

Co-Harness:协同进化框架如何优化LLM智能体的任务性能

1. 项目概述:当“缰绳”与“马”一同进化 最近在LLM智能体(LLM Agents)的圈子里,一个叫“Co-Harness”的概念开始被频繁讨论。乍一看这个标题——“Co-Harness: Co-Evolving Harnesses and Model Weights for LLM Agents”——可能…

2026/10/9 5:21:22

Loihi 2单神经元实现逻辑推理:神经形态计算的硬件原生算法突破

如果你关注过神经形态计算,可能会觉得它离实际应用还很远——功耗低但精度不够,适合脉冲神经网络却难以处理传统AI任务。但最近一项研究可能会改变这个印象:研究人员在英特尔Loihi 2神经形态芯片上,仅用 1个神经元 就实现了需要…

2026/10/9 10:08:08

SpringBoot+Vue新能源汽车充电系统:从零部署到功能测试全指南

这次我们来看一个基于 SpringBoot Vue 的前后端分离项目:新能源汽车充电服务系统。这是一个典型的毕业设计/毕设项目,提供了完整的源码、文档和讲解,非常适合计算机相关专业的学生进行学习、二次开发或直接作为毕业设计成果。对于开发者而言…

2026/10/11 2:02:29

WAND/WOR/WXOR本质是掩码驱动的位级写入指令

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

2026/10/11 2:02:29

MFC全局钩子实战:键盘鼠标输入捕获与DLL注入避坑指南

简介:本资源面向具备一定 C 与 Windows 开发基础的 MFC 学习者,聚焦全局钩子这一系统级事件监控技术,帮助解决键盘输入与鼠标行为实时捕获、记录的问题。项目通过 HOOK.DLL 动态库配合 SetWindowsHookEx 设置 WH_KEYBOARD_LL 与 WH_MOUSE_LL …

2026/10/11 1:57:29

医疗健康EMBA:投入成本、服务边界与长期合作价值

医疗健康EMBA的价值判断与选择维度 医疗健康领域的管理者在进修选择上,往往面临投入成本、服务边界与长期合作价值之间的权衡。判断是否适合某一项目,不能仅看品牌知名度,而应聚焦于课程设计是否匹配当前的职业阶段与组织需求。本文将从成本、…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑