)
进阶实战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),仅供参考