正则是酒馆内置的文本替换功能,默认会直接、不可逆地改写聊天记录文件本身。 编辑器里的「Alter Chat Display」和「Alter Outgoing Prompt」两个勾选框,作用是阻止 它动聊天记录,改成只动屏幕显示或只动发出去的提示词。两个框都不勾时破坏性最强。
正则会在哪些位置生效
每条正则要勾选一个或多个作用位置,界面上有五个,对应
regex_placement
枚举(engine.js:281):
| 值 | 名称 | 界面标签 | 作用对象 |
|---|---|---|---|
1 | USER_INPUT | User Input | 你发出的消息 |
2 | AI_OUTPUT | AI Output | 生成接口返回的消息 |
3 | SLASH_COMMAND | Slash Commands | STscript 命令发出的消息 |
5 | WORLD_INFO | World Info | 世界书条目正文,必须同时勾上 Alter Outgoing Prompt 才生效 |
6 | REASONING | Reasoning | 推理模型的思考块 |
枚举里还有两个值不出现在界面上:0 是 MD_DISPLAY,源码打了
@deprecated;4 是空缺,注释写着 sendAs (legacy)。
旧配置文件里出现这两个数字属于历史遗留,新写的正则用不到。
改显示、改提示词、改聊天记录有什么区别
由两个独立的勾选框决定,不是三选一。markdownOnly(Alter Chat Display)
只改屏幕上渲染出来的文字,promptOnly(Alter Outgoing Prompt)只改发给模型的
那一份。两个都不勾时,正则改的是存盘的聊天记录原文。
| 勾选 | 聊天记录 | 屏幕显示 | 发给模型的提示词 |
|---|---|---|---|
| 都不勾(默认) | 被改写,不可逆 | 跟着变 | 跟着变 |
| Alter Chat Display | 不动 | 被改写 | 原文 |
| Alter Outgoing Prompt | 不动 | 原文 | 被改写 |
| 两个都勾 | 不动 | 被改写 | 被改写 |
判定逻辑在
getRegexedString()
(engine.js:334):每条脚本只在自己声明的场景里跑。两个标志都为假,就只剩下
渲染和组装提示词之外的那一次调用,而那一次处理的正是即将写进聊天记录的原文。编辑器
对这两个框的说明
写得很直白:默认行为是 alter the chat file directly and irreversibly。
只勾 Alter Chat Display 时,被你擦掉的文字还留在上下文里,模型下一轮 照样看得见、照样接着写。想让模型真的不再看到它,要勾 Alter Outgoing Prompt,这条路 同样不动原始记录,出错随时可以关掉脚本恢复。真正需要改聊天记录的场景很少,多半是 批量清洗导入进来的旧对话。
怎么让正则只作用于最近几条消息
编辑器里的 Min Depth / Max Depth 两个数字框限制作用范围,0 指最后一条消息、
1 指倒数第二条,以此类推;留空表示不限。它们只在改显示和改提示词时起作用,
系统提示词与各类工具提示词不受影响。想做「只把最近三条里的括号动作擦掉」,靠这两个
字段比靠表达式本身省事。
宏替换的三种转义模式
正则里可以用 {{user}} 这样的宏。宏展开后的内容如果含有正则元字符
(比如 . 或 (),会破坏整条表达式,所以需要选转义模式。
取值来自同一文件的
substitute_find_regex
(engine.js:298):
| 值 | 名称 | 行为 |
|---|---|---|
0 | NONE | 不做宏替换 |
1 | RAW | 替换,但不转义。宏内容里的元字符会被当作正则语法 |
2 | ESCAPED | 替换并转义,宏内容一律当作字面文本 |
如果角色名或用户名里带标点,用 RAW 会让正则行为变得难以预料。
除非你确实想让宏内容参与正则语法,否则选 ESCAPED。
四个常见的坑
忘了写标志位。Find Regex 支持 /表达式/标志 的写法,标志由你自己填。
直接写裸表达式等于一个标志都没开,只会替换第一处匹配。要全局替换得写成
/……/g。
贪婪匹配吃掉整段。<.*> 会从第一个尖括号一路匹配到最后一个,
中间的正文全被吞掉。想匹配单个标签要用非贪婪写法 <.*?>。
忘了跨行。模型输出经常跨行,而 . 默认不匹配换行符。跨行匹配要么
加 s 标志(/……/gs),要么用 [\s\S] 代替 .。
作用位置选错。想擦掉模型输出却勾了 User Input,或者反过来。调试时先确认 这一项,比反复改表达式快得多。World Info 位置还多一个前提:不勾 Alter Outgoing Prompt 就完全不生效。
怎么安全地试一条新正则
先勾上 Alter Chat Display 再写。这样脚本只动屏幕上的渲染结果,聊天记录保持原样, 匹配范围不对就直接关掉,不留痕迹。观察几轮确认吃到的正是你想要的那段,再决定是 改成 Alter Outgoing Prompt,还是两个框都取消、让它真正落进记录。
顺带一提,正则改的是文本层,不改 提示词的组装顺序。想调整某段内容出现在提示词的 哪个位置,那是模板和插入深度的事,正则帮不上忙。