首页 中文文档 正则脚本

正则脚本:默认改的是聊天记录本身

基于 SillyTavern 1.18.0最后更新:2026-07-26
非官方文档。本站由 PokiTavern 维护,与 SillyTavern 开源项目没有隶属关系, 内容也未经该项目审核。文中的行为描述以 SillyTavern 1.18.0 源码为准,并附出处链接。

正则是酒馆内置的文本替换功能,默认会直接、不可逆地改写聊天记录文件本身。 编辑器里的「Alter Chat Display」和「Alter Outgoing Prompt」两个勾选框,作用是阻止 它动聊天记录,改成只动屏幕显示或只动发出去的提示词。两个框都不勾时破坏性最强。

正则会在哪些位置生效

每条正则要勾选一个或多个作用位置,界面上有五个,对应 regex_placement 枚举(engine.js:281):

名称界面标签作用对象
1USER_INPUTUser Input你发出的消息
2AI_OUTPUTAI Output生成接口返回的消息
3SLASH_COMMANDSlash CommandsSTscript 命令发出的消息
5WORLD_INFOWorld Info世界书条目正文,必须同时勾上 Alter Outgoing Prompt 才生效
6REASONINGReasoning推理模型的思考块

枚举里还有两个值不出现在界面上:0MD_DISPLAY,源码打了 @deprecated4 是空缺,注释写着 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_regexengine.js:298):

名称行为
0NONE不做宏替换
1RAW替换,但不转义。宏内容里的元字符会被当作正则语法
2ESCAPED替换并转义,宏内容一律当作字面文本

如果角色名或用户名里带标点,用 RAW 会让正则行为变得难以预料。 除非你确实想让宏内容参与正则语法,否则选 ESCAPED

四个常见的坑

忘了写标志位。Find Regex 支持 /表达式/标志 的写法,标志由你自己填。 直接写裸表达式等于一个标志都没开,只会替换第一处匹配。要全局替换得写成 /……/g

贪婪匹配吃掉整段。<.*> 会从第一个尖括号一路匹配到最后一个, 中间的正文全被吞掉。想匹配单个标签要用非贪婪写法 <.*?>

忘了跨行。模型输出经常跨行,而 . 默认不匹配换行符。跨行匹配要么 加 s 标志(/……/gs),要么用 [\s\S] 代替 .

作用位置选错。想擦掉模型输出却勾了 User Input,或者反过来。调试时先确认 这一项,比反复改表达式快得多。World Info 位置还多一个前提:不勾 Alter Outgoing Prompt 就完全不生效。

怎么安全地试一条新正则

先勾上 Alter Chat Display 再写。这样脚本只动屏幕上的渲染结果,聊天记录保持原样, 匹配范围不对就直接关掉,不留痕迹。观察几轮确认吃到的正是你想要的那段,再决定是 改成 Alter Outgoing Prompt,还是两个框都取消、让它真正落进记录。

顺带一提,正则改的是文本层,不改 提示词的组装顺序。想调整某段内容出现在提示词的 哪个位置,那是模板和插入深度的事,正则帮不上忙。

本文讲的功能,在 PokiTavern 的安卓端可以直接用:它内嵌了一个 SillyTavern 兼容服务端,不用 Termux、不用电脑。项目开源在 GitHub