Skip to content

修改正则

提示

请务必先阅读如何正确使用酒馆助手

点击查看对应类型定义文件

replaceTavernRegexes

完全替换酒馆正则。

警告

  • 这是一个很慢的操作! 尽量对正则做完所有事后再一次性 replaceTavernRegexes
  • 为了重新应用正则,它会重新载入整个聊天消息,将会触发 tavern_events.CHAT_CHANGED 进而重新加载全局脚本和楼层消息。这意味着如果你在全局脚本中运行本函数,则该函数之后的内容将不会被执行
ts
function replaceTavernRegexes(
  regexes: TavernRegex[],
  option: TavernRegexOption
): Promise<void>;
ts
type TavernRegexOption = TavernRegexOptionGlobal | TavernRegexOptionCharacter | TavernRegexOptionPreset;
ts
type TavernRegexOptionGlobal = {
  type: 'global';
};
ts
type TavernRegexOptionCharacter = {
  type: 'character';
  name?: string | 'current';
};
ts
type TavernRegexOptionPreset = {
  type: 'preset';
  name?: string | 'in_use';
};
ts
type TavernRegex = {
  id: string;
  script_name: string;
  enabled: boolean;
  run_on_edit: boolean;
  scope?: "global" | "character";

  find_regex: string;
  trim_strings: string;
  replace_string: string;

  source: {
    user_input: boolean;
    ai_output: boolean;
    slash_command: boolean;
    world_info: boolean;
  };

  destination: {
    display: boolean;
    prompt: boolean;
  };

  min_depth: number | null;
  max_depth: number | null;
};

参数

regexes

  • 类型: TavernRegex[]
  • 描述: 要用于替换的酒馆正则数组

option.type

  • 类型: 'global' | 'character' | 'preset'
  • 描述: 要操作的酒馆正则类型
    • 'global' - 全局正则
    • 'character' - 角色卡局部正则
    • 'preset' - 预设正则

option.name (仅 character 和 preset 类型)

  • 类型: string | 'current' | 'in_use'
  • 描述:
    • 对于 character 类型:角色卡名称,'current' 表示当前角色卡(默认值)
    • 对于 preset 类型:预设名称,'in_use' 表示当前使用的预设(默认值)

示例

ts
// 获取全局正则并修改
const regexes = getTavernRegexes({ type: 'global' });
regexes.forEach(regex => {
  if (regex.script_name.includes('关键词')) {
    regex.enabled = true;
  }
});
await replaceTavernRegexes(regexes, { type: 'global' });
ts
// 获取当前角色卡正则并修改
const regexes = getTavernRegexes({ type: 'character' });
regexes.forEach(regex => {
  regex.enabled = false; // 禁用所有正则
});
await replaceTavernRegexes(regexes, { type: 'character' });
ts
// 获取指定角色卡正则并修改
const regexes = getTavernRegexes({ type: 'character', name: '角色卡名称' });
regexes.forEach(regex => {
  if (regex.find_regex.includes('pattern')) {
    regex.replace_string = '新的替换文本';
  }
});
await replaceTavernRegexes(regexes, { type: 'character', name: '角色卡名称' });
ts
// 传入空数组可以清空正则列表
await replaceTavernRegexes([], { type: 'preset' });

updateTavernRegexesWith

使用更新函数更新酒馆正则,支持同步和异步更新。

性能提示

  • 这是一个很慢的操作! 尽量对正则做完所有事后再一次性更新
  • 为了重新应用正则,它会重新载入整个聊天消息,将会触发 tavern_events.CHAT_CHANGED 进而重新加载全局脚本和楼层消息
ts
function updateTavernRegexesWith(
  updater: (regexes: TavernRegex[]) => TavernRegex[],
  option: TavernRegexOption
): Promise<TavernRegex[]>;

function updateTavernRegexesWith(
  updater: (regexes: TavernRegex[]) => Promise<TavernRegex[]>,
  option: TavernRegexOption
): Promise<TavernRegex[]>;

参数

updater

  • 类型: (regexes: TavernRegex[]) => TavernRegex[](regexes: TavernRegex[]) => Promise<TavernRegex[]>
  • 描述: 用于更新酒馆正则的函数。它应该接收酒馆正则作为参数,并返回更新后的酒馆正则

option.type

  • 类型: 'global' | 'character' | 'preset'
  • 描述: 要操作的酒馆正则类型

option.name (仅 character 和 preset 类型)

  • 类型: string | 'current' | 'in_use'
  • 描述:
    • 对于 character 类型:角色卡名称,'current' 表示当前角色卡(默认值)
    • 对于 preset 类型:预设名称,'in_use' 表示当前使用的预设(默认值)

返回值

  • 更新后的酒馆正则: Promise<TavernRegex[]>

示例

ts
await updateTavernRegexesWith((regexes) => {
  regexes.forEach(regex => {
    if (regex.script_name.includes('舞台少女')) {
      regex.enabled = true;
    }
  });
  return regexes;
}, { type: 'global' });
ts
await updateTavernRegexesWith((regexes) => {
  regexes.forEach(regex => {
    regex.enabled = false;
  });
  return regexes;
}, { type: 'character' });
ts
await updateTavernRegexesWith((regexes) => {
  regexes.forEach(regex => {
    if (regex.script_name === '特定正则') {
      regex.find_regex = '新的查找模式';
      regex.replace_string = '新的替换文本';
    }
  });
  return regexes;
}, { type: 'global' });
ts
await updateTavernRegexesWith((regexes) => {
  return [
    ...regexes,
    {
      id: crypto.randomUUID(),
      script_name: '新正则',
      enabled: true,
      run_on_edit: false,
      scope: 'global',
      find_regex: '查找模式',
      trim_strings: '',
      replace_string: '替换文本',
      source: {
        user_input: true,
        ai_output: true,
        slash_command: false,
        world_info: false
      },
      destination: {
        display: true,
        prompt: true
      },
      min_depth: null,
      max_depth: null
    }
  ];
}, { type: 'global' });
ts
await updateTavernRegexesWith(async (regexes) => {
  // 执行异步操作,例如从服务器获取配置
  const config = await fetch('/api/regex-config').then(r => r.json());

  // 根据配置更新正则
  regexes.forEach(regex => {
    if (config.enabledRegexes.includes(regex.script_name)) {
      regex.enabled = true;
    }
  });

  return regexes;
}, { type: 'preset' });
ts
await updateTavernRegexesWith((regexes) => {
  return regexes.filter(regex => regex.script_name !== '要删除的正则');
}, { type: 'global' });
ts
await updateTavernRegexesWith((regexes) => {
  regexes.forEach(regex => {
    if (regex.script_name.includes('AI输出')) {
      // 只对 AI 输出生效
      regex.source.user_input = false;
      regex.source.ai_output = true;
      regex.source.slash_command = false;
      regex.source.world_info = false;
    }
  });
  return regexes;
}, { type: 'character' });

作者:KAKAA, 青空莉想做舞台少女的狗