news 2026/8/21 13:48:41

结构正则表达式入门:用ad的EDIT模式实现强大的批量文本编辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
结构正则表达式入门:用ad的EDIT模式实现强大的批量文本编辑

结构正则表达式入门:用ad的EDIT模式实现强大的批量文本编辑

【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad

批量处理文本时,大多数人第一反应是写脚本或使用 sed、awk,但结构正则表达式提供了一条更优雅的路径:把"找到文本"和"处理文本"拆分成一步步可组合的操作,让复杂的批量文本编辑变得清晰可控。ad是一款"可适应"的 Rust 文本编辑器,它借鉴了 Plan 9 中 sam 编辑器的结构正则表达式思想,通过内置的EDIT 模式,让你只需一条命令就能完成跨多行的查找、过滤、替换与重组。本文是面向初学者的结构正则表达式入门指南,带你快速上手这个强大的批量文本编辑工具。

什么是结构正则表达式?

普通正则表达式擅长匹配"一行"或"一段连续字符",而结构正则表达式擅长处理"文本的结构"。它不要求你一次写出完美的大正则,而是允许你分步骤逼近目标

  1. 先用循环命令切出感兴趣的区域(如每个函数、每个段落);
  2. 再用过滤命令剔除不关心的内容;
  3. 最后对保留下来的部分执行插入、删除、替换或打印。

这种"先定位、再操作"的方式,特别适合处理代码文件、日志、配置文件等多行结构文本。

ad 的 EDIT 模式是什么?

ad是一款融合了 vim 模态编辑、kakoune 多光标思想与 acme 可扩展理念的编辑器。它的模式除了常见的 NORMAL、INSERT、COMMAND、RUN 之外,还有一个专门执行结构正则表达式EDIT 模式,其命令语言源自 Plan 9 的 sam 编辑器。

在 EDIT 模式中,你只需输入:

Edit , s/mouse/clicky thing/g

即可把整个缓冲区中所有mouse替换为clicky thing——这看起来和 sed 很像,但真正的威力在于下面这些命令的组合。

核心命令速查表:一次掌握批量文本编辑

命令含义典型用途
s/re/template/替换全文替换(等价于x/re/ c/template/
x/re/循环匹配对每个匹配执行后续操作
y/re/在匹配之间循环按分隔符把文本切成块
g/re/过滤匹配只保留匹配的行或块
v/re/过滤非匹配排除匹配的行或块
i/template/匹配前插入批量添加前缀
a/template/匹配后插入批量添加后缀
c/template/替换每个匹配批量改写
d删除每个匹配批量删除
p/template/按模板打印提取信息生成报告

命令前的地址(如,表示整个缓冲区,14,24表示第 14 到 24 行)决定了操作范围,这也来自 sam 的 dot 思想——ad把"当前选区"当作一个可移动、可叠加的焦点,src/exec/addr.rs 中实现了这套地址解析。

实战一:批量删除与替换

删除所有空行,只需一条命令:

Edit , x/^\n/ d

把每个单词改为大写开头的占位符:

Edit , x/\b\w+\b/ c/{0}/

实战二:用嵌套命令处理多行结构

结构正则表达式最迷人的地方在于嵌套组合。下面这个例子来自官方教程 docs/tour/structural-regex2:从第 14 到 24 行中,找出所有职业为 programmer 的人名并打印。

Edit 14,24 y/\n\n/ x/@*occupation: programmer@*/ x/name: (.*)/ p/{1} is a programmer\n/

拆开来看:

  1. y/\n\n/—— 按空行把选区切成一个个段落;
  2. x/@*occupation: programmer@*/—— 只保留包含该职业的段落;
  3. x/name: (.*)/—— 在段落内提取姓名;
  4. p/{1} is a programmer\n/—— 用模板输出结果。

一次执行,直接生成Alice is a programmer这样的报告。这就是结构正则表达式"分步定位"的核心优势。

实战三:模板变量让批量编辑更强大

除了{0}(整个匹配)、{1}{2}(捕获组)之外,ad的模板还支持三个上下文变量:{FILENAME}{ROW}{COL}。这在脚本化提取信息时非常有用。

项目自带的示例脚本 examples/scripts/result_fns.ad 演示了如何扫描 Rust 文件中所有返回Result的函数:

, x/fn@*?\{/ g/->.*Result.*\{/ x/fn (\w+)@*?-> (.*?) \{/ p/({FILENAME}) {1} returns {2}\n/

流程清晰:选中全文 → 找到函数签名 → 过滤出返回 Result 的 → 提取函数名和返回类型 → 打印带文件名的报告。配合ad -f 脚本路径 文件路径的命令行模式,你甚至可以把这些操作固化成可复用脚本,比如 examples/scripts/impl_blocks.ad 和 examples/scripts/fancy_impl_blocks.ad 展示了如何从源码中批量提取 impl 块及其函数签名。

更进一步:深入 ad 的实现

  • 结构正则表达式的解析与执行引擎:src/exec/mod.rs
  • 地址语法与 dot 操作:src/exec/addr.rs
  • 命令运行器(支持执行外部命令):src/exec/runner.rs
  • 自研的正则引擎(可处理字符流):src/regex/
  • 更完整的命令列表:docs/tour/structural-regex

小结

结构正则表达式的学习曲线并不陡峭:只需记住x(循环)、y(切块)、g/v(过滤)这几个组合子,再加上i/a/c/d/p几个动作,就足以应付绝大多数批量文本编辑场景。而ad把这一整套能力放进了 EDIT 模式,让你在编辑器内就能完成从"定位"到"改写"的完整流程。如果你经常面对多行结构文本,不妨从今天的一条Edit , x/.../ c/.../命令开始,体验这种更接近思维过程的编辑方式。

【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 13:48:33

Excel批量隐藏与保护公式:从原理到VBA自动化实战

1. 先搞清楚“隐藏公式”到底要解决什么问题很多人看到“隐藏公式”这个词,第一反应是让单元格里的公式看不见。这没错,但实际工作中,我们往往有更具体、更头疼的需求:既不想让别人看到公式内容,也不想让别人随意修改公…

作者头像 李华
网站建设 2026/8/21 13:45:16

拖延症自救!亲测这6款AI论文软件,从构思到降重全程逆袭

从开题到降重,AI工具链10分钟搞定文献综述,知网查重率直降!解放双手专注核心论点,这才是学术价值的真正突破。 1.千笔 AI:开题报告 & 文献综述「闪电战专家」 实测场景:经济学开题报告从空白到导师通过…

作者头像 李华
网站建设 2026/8/21 13:43:31

ROS机器人开发入门:Topic与Service通信机制详解与实战

这次我们来看机器人操作系统ROS的核心基础,特别是Topic和Service这两种最关键的通信机制。对于想入门具身智能机器人开发的朋友来说,理解并掌握ROS的通信模型,是搭建任何机器人应用(无论是仿真小车导航还是真实机械臂控制&#xf…

作者头像 李华
网站建设 2026/8/21 13:42:29

深入解析SQLite B-Tree平衡算法:从原理到工程实现

在数据库内核开发领域,B-Tree的平衡算法是决定其性能与稳定性的基石。我曾以为理解了B-Tree的基本原理——插入、分裂、合并——就能轻松驾驭其实现。直到我深入SQLite的源码,亲手实现其B-Tree的平衡逻辑时,才真正体会到这可能是“我写过的最…

作者头像 李华
网站建设 2026/8/21 13:41:55

蓝桥杯国赛模拟题核心解法:事件驱动与状态快照

1. 项目概述:一道题吃透蓝桥杯国赛“模拟类”命题逻辑 “蓝桥杯国赛每日一题:外卖店优先级(模拟)”——这行标题一出现,我就知道又到了每年三四月蓝桥杯冲刺季最典型的训练节奏。它不是一道孤立的算法题,而…

作者头像 李华