Skip to content

正则美化

正则美化允许你配置多条匹配规则和替换内容。

它的作用,是把开场白或 AI 回复里的特定文本替换成 HTML 和 CSS,让原本普通的文本显示成更完整的 UI。

提示

  • 如果你只是想先做出效果,不打算手写正则,可以在平台里搜索“正则助手”。
  • 如果你是新建角色卡,而不是兼容旧内容,优先使用 JSON 美化

适用场景

  • 格式化角色开场白,补上样式和布局
  • 美化 AI 回复内容,增强视觉效果
  • 移除特定文本,例如 <think>...</think>
  • 统一消息格式,让输出更整齐

示例

比如让 AI 输出:

text
<status>
时间:第 3 天 / 夜晚
地点:中央医院
天气:降雪
</status>

然后再把它替换成一个状态卡片,而不是让 AI 直接生成整套卡片结构。

这样做有几个直接好处:

  • 更省 Token:AI 不需要每次都输出复杂标签和样式
  • 更容易控格式:模型只需要维持一段相对稳定的文本
  • 更方便改样式:多数时候只改正则脚本,不用反复改提示词

提示

一条正则脚本,可以先简单理解成两部分:

  • 查找正则:我要找什么
  • 替换内容:找到之后,换成什么

字段说明

脚本状态

脚本开关:它很适合做临时测试。比如你怀疑某一条脚本导致样式异常,可以先关掉,而不是直接删掉。

脚本名称

脚本名称只给你自己看,建议直接写用途,例如:

  • 状态栏
  • 对话高亮
  • 去除 think 标签

查找正则

查找正则,就是匹配目标文本的规则。

你可以直接写普通模式,也可以写带标志位的形式,比如:

  • abc
  • /abc/g
  • /abc/gi

如果你暂时不熟悉正则,先记住一条最实用的经验:

先让 AI 输出一个稳定的包裹标记,再整块去找。

示例

AI 输出:

text
<status>
时间:夜晚
天气:降雪
</status>

那你可以这样找它:

text
/<status>([\s\S]+?)<\/status>/g

这条写法里,最值得先看懂的是两部分:

  • <status> ... </status>:表示只处理被这对标签包住的内容
  • ([\s\S]+?):表示把中间内容抓出来,并作为第 1 个捕获组

提示

新手起步时,更稳的方式不是上来写很复杂的正则,而是:

  1. 先约定一对固定标记,比如 <status>...</status>
  2. 再整块匹配
  3. 最后替换成 HTML

关于 g 和多行匹配

这是两个特别容易踩的坑:

  1. 要替换多处时,记得加 g
  2. 要匹配跨行内容时,优先用 [\s\S]+?

示例

  • 只替换第一处:/<status>(.+?)<\/status>/
  • 替换全部:/<status>([\s\S]+?)<\/status>/g

WARNING

. 默认不匹配换行。

所以只要你的内容可能跨行,就不要太依赖 .+?,直接换成 [\s\S]+? 通常更稳。

替换内容

替换内容就是“找到之后,最终要显示成什么”。

这里支持:

  • 常规 HTML 标签
  • <style> 样式块
  • 捕获组引用
  • 部分变量替换

能不能直接写 HTML 和 CSS?

可以,而且这正是它的主要用途之一。

你不需要写完整网页结构,不必写这些:

  • <!DOCTYPE html>
  • <html>
  • <head>
  • <body>

通常直接写:

  • <style>...</style>
  • <div>...</div>
  • <span>...</span>

就够了。

如果你还想补点击、切换、表单等轻量交互,可以继续配合 标签交互指令

WARNING

<script><iframe><object> 这类危险标签不要用。

即便写进去,也会被安全清洗或过滤,不会按你预期的方式执行。

去除字符串

这个字段的作用是:

在把捕获组内容塞进替换模板前,先把某些固定字样删掉。

多个字符串请用 英文逗号 分隔。

示例

原文:

text
<status>【状态】夜晚 / 降雪</status>

查找正则:

text
/<status>([\s\S]+?)<\/status>/g

去除字符串:

text
【状态】

替换内容:

html
<div class="status-box">$1</div>

最终页面里,$1 就不会再带 【状态】 这几个字符。

提示

如果正则本身已经能精准排除无用文字,就尽量别再靠“去除字符串”补救。

它更适合做轻量清理,不适合拿大块脏数据硬修。

状态栏示例

如果你是第一次上手,最适合从“状态栏”开始。

第一步:让 AI 输出稳定标记

比如约定 AI 在需要展示状态时,输出:

text
<status>
  <时间>当前剧情中时间的具体描述</时间>
  <地点>当前剧情中地点的具体描述</地点>
  <天气>当前剧情中天气的具体描述</天气>
</status>

第二步:写查找正则

text
/<status>[\s\S]*?<时间>([\s\S]*?)<\/时间>[\s\S]*?<地点>([\s\S]*?)<\/地点>[\s\S]*?<天气>([\s\S]*?)<\/天气>[\s\S]*?<\/status>/g

第三步:写替换内容

html
<style>
.status-container {}

.status-header {}
</style>

<div class="status-container">
  <div class="status-header">当前状态</div>
  <div class="status-item">
    <div class="status-label">时间</div>
    <div class="status-value">$1</div>
  </div>

  <div class="status-item">
    <div class="status-label">地点</div>
    <div class="status-value">$2</div>
  </div>

  <div class="status-item">
    <div class="status-label">天气</div>
    <div class="status-value">$3</div>
  </div>
</div>

这样,AI 还是只需要输出那段简洁文本,但前端看到的会是一张状态卡片。

多个正则脚本顺序如何执行?

正则脚本是 按列表顺序一条一条执行 的。

也就是说:

  • 后面的脚本,看到的是前面脚本已经处理过的内容
  • 如果多个脚本命中同一段文本,后面的结果可能覆盖前面的结果

这也是为什么列表支持拖拽排序。

WARNING

最常见的两个顺序问题:

  • 两条脚本查找的是同一类内容,后者把前者结果又改了一遍
  • 前一条已经把原始标记换掉了,后一条再也匹配不到原文

如果你发现“这条脚本明明没写错,但就是不生效”,先看顺序,再看正则本身。

写 CSS 时要注意什么?

平台对正则产生的样式,做了几层保护和限制。

1. 样式作用域

正则替换出来的 <style>,会被提取到当前消息的 Shadow DOM 样式表中。

简单理解,它主要影响当前这条消息。

2. 类名规范

虽然样式作用域已经限制住了,但同一条消息里如果多条脚本用了相同类名,样式还是会叠加或覆盖。

比如不要多条脚本都写:

css
.main { ... }
.title { ... }

更稳的写法是带用途前缀:

css
.status-box { ... }
.status-box-title { ... }

3. 灾难性回溯

当你的正则里写了太多模糊的嵌套量词,比如 (a+)+,一旦遇到匹配失败的字符串,正则引擎就可能“钻牛角尖”。

它会反复尝试大量组合路径,导致 CPU 瞬间拉满,程序直接卡死。

如何避免

  • 少用嵌套量词:不要写类似 (.*)* 这种层层叠加的匹配
  • 尽量明确边界:能写具体范围时,就别全部交给 .*
  • 优先用非贪婪模式:多使用 [\s\S]*?,找到目标就及时停止

可以和 JSON 美化一起用吗?

可以。如果一条消息同时用了 JSON 美化和正则美化:

  • JSON 先执行
  • 正则后执行

这意味着正则看到的,是 JSON 模板处理过之后的内容。

提示

建议两者各司其职,不要混着处理同一段内容。

原因在于遇到问题时,可能不是正则写坏了,而是 JSON 已经先改过一次。

起步建议

如果你从来没写过正则,不要一上来做复杂页面。

先按下面这套最小流程来:

  1. 先让 AI 输出一对稳定标签,比如 <status>...</status>
  2. 用一条正则把整块抓出来
  3. 用最简单的 <style> + <div> 包一层
  4. 在右侧预览里反复看效果
  5. 脚本保存后,再保存整个角色卡

你先把这一条跑通,再去做第二条、第三条,会比一开始就堆很多脚本稳得多。

有用链接

火狐AI 产品文档