AUTO-MAS 表达式引擎实战:7 个技巧快速实现复杂调度条件与日志推送

发布时间:2026/10/30 2:14:11
AUTO-MAS 表达式引擎实战:7 个技巧快速实现复杂调度条件与日志推送
  • 工作流自动化
  • 任务调度
  • 桌面应用

【免费下载链接】AUTO-MAS

多脚本多配置统一管理与自动化工具 | 轻松管理大量脚本并存储多个用户配置、设计自动化任务流、监看脚本日志,大幅提高自动化代理效率与稳定性!

项目地址:https://gitcode.com/gh_mirrors/au/AUTO-MAS
点击查看免费下载

AUTO-MAS 是一款多脚本多配置统一管理与自动化工具,它的表达式引擎(extract expression)让你在日志监控、推送采集与任务成败判定中,用一行$()语法加内置函数链,就能把"复杂调度条件"写进自动化任务流。本文面向新手,用真实游戏日志带你快速上手:从最基础的提取语法,到环视排除、多字段拼接、多行聚合等 7 个进阶技巧,并给出常见坑与调试路径,让你少走弯路。


一、表达式引擎在哪里发挥作用?

AUTO-MAS 的表达式引擎(源码位于 app/utils/expression/)为自动化任务流提供三种核心能力:

  • 推送日志采集:规则先用「匹配正则」过滤日志行,再用$()提取表达式精确取出要推送的字段。各游戏任务内置的采集规则可参考 app/task/ZzzOd/push_log.py、app/task/MaaEnd/push_log.py;
  • 多行聚合:跨越多行的任务信息(如 BetterGI 一条龙任务),用起始/结束正则圈定「窗口」,再在窗口里提取并拼接字段;
  • 成功/失败标志匹配:Script.SuccessLog/Script.ErrorLog配置按 Split(关键字包含)或 Regex(正则)模式判定任务成败,是调度器里最常用的「调度条件」之一,实现见 app/utils/LogPatternExtractor.py。


二、先搞懂$()语法与 3 种拼接

  • $(正则):正则提取作用域。只有捕获组()里的内容才会被提取,多个捕获组按顺序用换行拼接;
  • "文本":字面量,原样输出,支持\"、\\、\n、\t转义,常用于加前缀/后缀;
  • +:同行拼接——左右片段拼在同一行;
  • ;:换行拼接——左右片段各占一行。

⚠️ 关键规则:同一行内所有$()必须全部命中,该行才会输出;任一未命中则整行跳过。这正是"复杂调度条件"的实现基础。

以 ZzzOd(绝区零一条龙)的采集规则为例,app/task/ZzzOd/push_log.py 中的写法:

匹配正则:指令\[ (.+?) \] 执行成功 提取表达式:"OK:体力刷本|🔋" + $((?:返回状态 剩余电量 )(\d+))

命中指令[ 体力刷本 ] 执行成功 返回状态 剩余电量 187时,输出OK:体力刷本|🔋187。


三、技巧一:函数链——正则取不到的,用内置函数"掐头去尾"

AUTO-MAS 表达式内置 9 个文本处理函数,可像 Excel 函数一样用.串联成函数链。核心思路:用正则负责「圈出字段」,用函数负责「改写字段」。

函数用法说明
cut.cut(num)切除首尾字符,正数去头、负数去尾
get.get(num)保留首尾字符,正数留头、负数留尾
sub.sub(start, end)提取两位置间文本,从 1 计数,负数倒数
cutby.cutby("定位文本", 0/1, 0/1, 序号)按文本定位截断:去头/去尾、留/删定位文本、第几次出现
subby.subby("首", "末", 0/1, 0/1, 序号, 序号)提取两段文本之间的内容
replace.replace("旧", "新")替换子串
trim.trim()去除首尾空白
upper/lower.upper()/.lower()英文转大写 / 小写

可选参数都可省略;定位文本找不到时函数会跳过处理、返回原文,不会报错。

当正则不好写时,可以让$()取整行文本,再衔接函数链定位截断。例如从指令[ 咖啡店 ] 执行成功 返回状态 无需运行中提取指令名:

"✓ "+$().cutby("指令[ ",0,1).cutby(" ]",1,1)
  • $()→ 获取整行(可多次复用)
  • .cutby("指令[ ",0,1)→ 去头并删掉定位文本,得咖啡店 ] 执行成功 返回状态 无需运行
  • .cutby(" ]",1,1)→ 去尾到],得咖啡店
  • "✓ "+→ 拼前缀,最终✓ 咖啡店

进阶:逐行前缀。当一个$()提取出多行结果时,字面量前缀只会加在第一行。用replace("\n","\n⏸")把每个换行替换成「换行+前缀」,再在开头补一个前缀即可:

"⏸"+$('([^']+)').replace("\n","\n⏸")

命中未处理的任务列表 ['买信用商店', '刷体力', '活动奖励']时,逐行输出⏸买信用商店、⏸刷体力、⏸活动奖励。


四、技巧二:把"排除条件"写进调度——环视一次排除多个节点

很多调度需求本质是"只要 A,但要排除 B、C"。用否定先行(?!...)可在匹配正则里一次性排除多个不想要的节点(源码 app/utils/LogPatternExtractor.py 中匹配正则采用search语义):

匹配正则:指令\[(?!\s*(?:等待大世界画面|返回大世界|前往菜单|体力刷本)).+?\] 执行成功 提取表达式:"✓ "+$(指令\[\s*(.+?)\s*\] 执行成功)
  • (?!\s*(?:...))一次性排除导航/过渡节点,推送里不再出现返回大世界这类噪音;
  • 可排除的名单随你的调度需求任意增减,无需改动其他配置;
  • 坑位提示:可选空格要放进环视内部写成(?!\s*通知),写成\s*(?!通知)会因\s*回溯到 0 而失效。

失败行带原因:同行拼接两个$(),全部命中才输出:

"✗ "+$(指令\[\s*(.+?)\s*\] 执行失败)+" "+$(返回状态\s+(.+))

输出✗ 切换账号 未配置账号密码。两个片段中任一未命中,整行跳过——这本身就是一条"必须同时满足"的复合调度条件。

针对特定节点单独配置:

匹配正则:体力刷本.+执行成功 提取表达式:"✓ 体力刷本 剩余电量 "+$(剩余电量\s+(\d+))

.+执行成功精准命中"执行成功"行,跳过同名的"节点"行;指令名用字面量写死,只动态提取剩余电量后的数字。


五、技巧三:多行聚合——跨行信息拼成一条推送

单行模式一行一行处理,但许多任务的关键信息分散在多行。用「起始正则 + 结束正则」圈定一个窗口,窗口关闭后把整段内容交给提取表达式:

提取表达式:$((一条龙任务执行: \d+/\d+))+" -> "+$((邮件:[^\n]+));$((任务结束))
  • $()提取任务进度,$()提取邮件内容,用+拼在同一行;
  • $()提取结束标记,;让其独占一行;
  • 窗口内的噪声行(如地图特征点加载完成!)因未命中任何片段被自动过滤。

同一时刻只允许一个窗口打开,所以一条龙日志里的 1/4~4/4 四段任务,一条规则会自动产出 4 条结果。


六、技巧四到六:3 个最常见的坑(附正确写法)

⚠️ 坑 1:裸文本不生效

提取表达式中,正则必须用$()包裹:

指令[ 咖啡店 ] 执行成功 ✗ 裸文本,不会被识别 $(指令\[\s*(.+?)\s*\] 执行成功) ✓ 正确

⚠️ 坑 2:无捕获组没有输出

$()内正则若没有捕获组,只会匹配、不提取,返回空串导致该行不输出:

$(任务结束) ✗ 无捕获组,返回 "" $((任务结束)) ✓ 用捕获组包裹整段正则

⚠️ 坑 3:.默认跨行贪吃

$()内正则默认开启DOTALL(源码 app/utils/expression/evaluator.py),.会跨行:

$((邮件:.+)) ✗ 会吞掉后面的所有行 $((邮件:[^\n]+)) ✓ 只取邮件这一行

此外,提取结果"多了"或"少了",多半是贪婪问题——把+/*换成非贪婪的+?/*?。


七、完整调试流程:先过滤、再提取、后验证

  1. 先只配匹配正则(提取表达式留空),确认要处理的行被正确过滤出来;
  2. 再填提取表达式,用$()包住要提取的部分;
  3. 用规则旁的 🐛调试按钮粘贴真实日志行,即时验证每一行的命中/未命中状态;
  4. 结果不对时:多了 → 试非贪婪+?;少了 → 检查捕获组与环视写法。

规则编辑界面对应 frontend/src/views/EditView/Script/components/LogPatternRule.vue,内置文档弹窗对应 frontend/src/views/EditView/Script/LogPatternDocsModal.vue;校验与逐行调试入口在 app/utils/LogPatternExtractor.py 的validate_pattern/debug_pattern函数。


八、核心路径速查表

模块路径
表达式解析(语法 → AST)app/utils/expression/parser.py
表达式编译与求值app/utils/expression/evaluator.py
9 个内置函数实现app/utils/expression/functions.py
日志模式匹配器(split/regex/多行聚合/成败标志)app/utils/LogPatternExtractor.py
日志采集会话(规则注册、推送)app/log_box/collect.py
内置采集规则示例(ZzzOd)app/task/ZzzOd/push_log.py
内置采集规则示例(MaaEnd)app/task/MaaEnd/push_log.py
成功/失败标志配置项app/models/config.py

小结 🎯

记住三句话:$()圈字段、函数链改字段、(?!...)写排除。掌握$()+ 内置函数 + 环视排除 + 多行聚合这四件套,你就能把绝大多数复杂调度条件写进 AUTO-MAS 的自动化任务流,让推送报告干净、精准、稳定。

  • 工作流自动化
  • 任务调度
  • 桌面应用

【免费下载链接】AUTO-MAS

多脚本多配置统一管理与自动化工具 | 轻松管理大量脚本并存储多个用户配置、设计自动化任务流、监看脚本日志,大幅提高自动化代理效率与稳定性!

项目地址:https://gitcode.com/gh_mirrors/au/AUTO-MAS
点击查看免费下载
上一篇:RDP Wrapper 免费解锁 Windows 多用户远程桌面:rdpwrap.ini 实战手册
下一篇:Universal Ctags 解析 reStructuredText 内嵌代码块:guest 解析器与 code-block 指令实战解析

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