正規表現スクリプト
正規表現スクリプトとは、チャットの文章を自動で書き換える検索と置換のルールです。AIの返信を整える、自分のメッセージの形を変える、モデルが受け取る文章を変える、といった用途に使います。使うのにプログラミングの知識は要りません。
regexは「regular expression」(正規表現)の略で、ルールに一致する文章を見つける検索のパターンです。パターンは一度設定すれば、一致するすべてのメッセージで動きます。
例: モデルによっては、動作をアスタリスクで囲みます。
*She smiles* Hello there.パターン\([^]+)\*を、正確にそのままコピーしてください。これを$1に置き換えると、アスタリスクが消え、中の文章は残ります。
She smiles Hello there.$1は「1つ目の丸括弧が捉えた文字列」という意味です。ほかによくある使い道は、丸括弧で書かれたキャラクター外の注記の削除、特定の語の伏せ字化、あるキャラクターの書式の癖の修正です。
正規表現スクリプトを作る
全体で使うスクリプトは、Presets(プリセット)パネルのRegexes(正規表現)セクションにあります。上部バーのPresetsボタンから開きます。
正規表現スクリプトの作成
- Presetsを開き、Regexesを探します。
- Create regex(正規表現の作成)をクリックします。編集画面が開きます。
- 上部に名前を入力します。新しいスクリプトの名前は「New Regex Script」です。
- Find Pattern (Regex)(検索パターン)に
\([^]+)\*と入力します(編集画面の項目を参照)。 - Replace With(置換後の文字列)に
$1と入力します。 - Apply To(適用先)では、AI Outputを選んだままにします。デフォルトの適用範囲であるOnly Displayが安全な選択です(スクリプトが動く場所を選ぶを参照)。
- Live Test(動作テスト)に
She smiles Hello there.を貼り付けます。Result:にはShe smiles Hello there.と表示されるはずです。 - Save(保存)をクリックします。緑色のSavedの表示が少しの間現れます。
- チャットで確認します。AIの返信にアスタリスクで囲まれた文章があっても、アスタリスクは表示されなくなります。
うまくいかなかった場合: Find Pattern (Regex)の下に赤いエラーが出ていると、保存できません。パターンが不正か、安全ではありません。安全性とパフォーマンスを参照してください。
スクリプトの管理
Regexesの一覧の各行には、スクリプトの名前、AIまたはUserのタグ、/pattern/flagsの形式のパターン、オン/オフのトグル(すぐに反映されます)、Edit regex(正規表現の編集、鉛筆アイコン)、Delete regex(正規表現の削除、ゴミ箱アイコン)が並びます。スクリプトが1つもないときは「No regexes yet」と表示されます。行のハンドルをドラッグすると、実行順を変えられます。
セクションの見出しには、Create regex、Import regexes from JSON(JSONから正規表現をインポート)、Export regexes to JSON(JSONへ正規表現をエクスポート、全体で使うスクリプトをすべて1つのファイルに保存)の3つのアイコンボタンがあります。1人のキャラクターに結び付いたスクリプトは、別に管理します。スクリプトを1人のキャラクターに限定するを参照してください。
編集画面の項目
Find Pattern (Regex)
検索に使うパターンです。パターンだけを書き、先頭や末尾にスラッシュは付けません。プレースホルダーには、例として\([^]+)\*が表示されます。
Replace With
一致した箇所と入れ替わる文字列です。空のままにすると、一致した箇所を削除します。$1、$2などで、捉えた文字列を再利用できます。捉えた文字列の前に次の記号を置くと、文字の大小を変えられます。
| 書き方 | 結果 |
\u$1 | 捉えた文字列の先頭を大文字にします。 |
\U$1\E | 捉えた文字列全体を大文字にします。 |
\l$1 | 捉えた文字列の先頭を小文字にします。 |
\L$1\E | 捉えた文字列全体を小文字にします。 |
C:\UsersのようなWindowsのパスなど、バックスラッシュをそのまま含む文字列は書いたとおりに残ります。
Regex Flags
パターンの一致のしかたを変えるトグルボタンです。新しいスクリプトではgとiがオンになっています。
| フラグ | 意味 |
g | Global: 最初の1件だけでなく、一致したすべての箇所を置き換えます。 |
i | Case-insensitive: 大文字と小文字を区別しません。 |
m | Multiline: ^と$が改行位置にも一致します。 |
s | dotAll: .が改行文字にも一致します。 |
u、y、d | Unicode、sticky、match indices。特殊な用途向けです。 |
Trim Strings
置換のあとに取り除く単純な文字列を並べる、任意の一覧です。Add trim string(削除する文字列を追加)をクリックすると行が増え、Xボタンで行を削除できます。パターンで一致させるより直接入力したほうが簡単な、決まった文字列に使います。
Live Test
サンプルの文章を貼り付けると、Result:の下に結果が表示されます。Live Testで確認できるのは、検索、置換、削除の処理だけです。適用先、オン/オフの状態、キャラクターの範囲、深さは、実際のチャットで評価されます。パターン、置換後の文字列、削除する文字列には、{{user}}や{{char}}などのマクロを使えます。Live Testでは、マクロはサンプルの値になります。マクロを参照してください。
スクリプトが動く場所を選ぶ
Apply To
Apply To(適用先)は、スクリプトがチャットのどちら側を対象にするかを決めます。少なくとも1つは選んだままにしてください。両方を選ぶこともできます。
- AI Output: AIの返信が表示される前に動きます。
- User Input: 自分のメッセージが送信される前に動きます。
Apply Mode
Apply Mode(適用範囲)はAdvanced Options(詳細設定)の中にあります。書き換えによって何が変わるかを決めます。新しいスクリプトではOnly Displayが選ばれています。
- Only Display: チャットで見える内容を変えます。保存されるメッセージと、その後にモデルが受け取るコンテキストは変わりません。返信の見た目を整えるには、これがいちばん安全です。
- Only Prompt: モデルが受け取る内容を変えます。この変更はプロンプトプレビューにも表示されます。表示と保存されるメッセージは変わりません。モデルがまねし続けるものを取り除くのに使います。
- Both: 表示とプロンプトの文章の両方を変えます。
自分のメッセージの場合、User InputのスクリプトをOnly DisplayまたはBothに設定すると、メッセージは送信される直前に書き換えられます。見た目だけでなく、保存されて送信されるメッセージそのものが変わります。送信するメッセージには、表示だけを変えるモードはありません。
Execution OrderとDepth Range
どちらもAdvanced Optionsの中にあります。
- Execution Order(実行順)は数値です。小さい数値ほど先に実行されます。これは、同じ文章に複数のスクリプトが一致しうるときに重要になります。新しいスクリプトの初期値は0で、保存時にアプリが空いている次の番号を割り当てます。Regexesの一覧で行をドラッグすることもできます。
- Depth Range(深さの範囲)は、スクリプトがどこまでさかのぼって動くかを、MinとMaxで制限します。いちばん新しいメッセージが深さ0、その1つ前が深さ1、と続きます。両方を空欄のままにすると、深さに関係なく動きます。MinがMaxより大きい場合は保存できません。
グループチャット
これは、Individual(個別)のグループモードを使うRoleplayチャットで、Only PromptとBothに当てはまります。
- 適用先は、プロンプトを受け取るキャラクターを基準に決まります。
- 自分のメッセージと他のキャラクターのメッセージは、User Inputとして扱われます。
- 応答するキャラクター自身の返信は、同じグループターン内の以前の返信も含めて、AI Outputとして扱われます。
- 書き換えたプロンプトを誰が受け取るかは、引き続きキャラクターの制限で決まります。思考を隠すスクリプトの対象外にしたナレーターには、元の思考が渡されます。
スクリプトを1人のキャラクターに限定する
スクリプトは、どこでも動かすのではなく、特定のキャラクターに結び付けられます。方法は2つあります。
- 編集画面で、Apply ToカードのSpecific Characters(特定のキャラクター)をオンにし、1人以上のキャラクターを選びます。トグルがオフのときは、スクリプトは「Applies to all characters」の状態です。オンにした場合は、キャラクターを1人以上選んでください。
- キャラクター側で、キャラクターを開いてAdvanced(詳細設定)タブに移動し、Regex Scripts(正規表現スクリプト)カードを探します。このカードに並ぶのはそのキャラクターのスクリプトだけで、カード専用のCreate regex、インポート、エクスポートのボタンがあります。先にキャラクターを保存してください。保存していない場合、カードにはまだスクリプトを追加できないと表示されます。
このカードから編集画面を開くと、Character Editorから離れます。キャラクターに未保存の変更がある場合は、アプリが先に警告します。
チャットごとのScoped Regex Scripts設定
キャラクター単位のスクリプトは、それだけですべてのチャットで動くわけではありません。チャットごとの設定で制御します。Chat Settings(チャット設定)を開いてください。Scoped Regex Scripts(範囲限定の正規表現スクリプト)セクションは、そのチャットのキャラクターの少なくとも1人が範囲を限定したスクリプトを持つときにだけ表示されます。
| モード | 動作 |
| Disabled(デフォルト) | 範囲を限定したスクリプトはオフです。全体で使うスクリプトだけが動きます。 |
| Exclusive | 範囲を限定した各スクリプトは、自分のキャラクターのメッセージだけを書き換えます。 |
| Chat | 範囲を限定したすべてのスクリプトが、チャット内のすべてのメッセージを書き換えます。 |
Use preset default(プリセットのデフォルトを使用)は、プロンプトプリセットのScoped regex default(範囲限定の正規表現のデフォルト)に従います。モードを選ぶと、このチャットではそのモードが優先されます。新しいチャットを特定のモードで始めるには、次のいずれかを使います。
- プリセットのデフォルトとして設定します。
- デフォルトの設定プロファイルに保存します。
- モードを選んでから、Reset View(表示をリセット)の横にあるお気に入りレイアウトの星をクリックします(新しいチャットのレイアウトを選ぶを参照)。
モードの下には、範囲を限定したスクリプトがキャラクターごとに並び、スクリプトごとにスイッチがあります。このスイッチはスクリプト自体のものなので、切り替えるとすべてのチャットでそのスクリプトが変わります。モードが制御するのは表示側のスクリプトです。プロンプト側のスクリプトは、返信を生成しているキャラクターに常に従います。
スクリプトのインポートと入れ替え
SillyTavernからのインポート
Marinaraは、SillyTavernのキャラクターカードに同梱された正規表現スクリプトを読み込みます。カードをインポートすると、Imported regex scripts(インポートした正規表現スクリプト)セクションに2つの選択肢が表示されます。
- Character only(デフォルト): スクリプトはそのキャラクターに限定されたままです。
- Global: スクリプトがPresetsに追加され、すべてのチャットで動きます。
この選択は、キャラクターを1人ずつ取り込むウィンドウと、Import from SillyTavern Folderによる一括インポートで表示されます。パターンが空のスクリプトや、安全性チェックに通らないパターンのスクリプトは飛ばされます。スクリプトだけの単純なJSONファイルをインポートするには、RegexesのImport regexes from JSONを使います。SillyTavernからのインポートを参照してください。
Regexパックの入れ替え
- Presets → Regexes(プリセット → 正規表現)で、Select regex scripts(Regexスクリプトを選択)を選びます。
- 古いパックの項目にチェックを入れるか、Select all regex scripts(すべてのRegexスクリプトを選択)を選びます。
- 操作バーのExport(エクスポート)またはDelete(削除)を使います。削除は一度だけ確認され、取り消せません。
- 更新版のパックをインポートします。
削除に失敗した項目は、再試行できるよう選択されたままになります。未選択のスクリプトはそのまま残ります。プリセットへの割り当ては、引き続き正規表現の編集画面で行えます。
安全性とパフォーマンス
すべてのパターンは、保存や実行の前に検査されます。処理が遅くなってアプリが固まる可能性の高いパターンは、次のメッセージとともに拒否され、修正するまで保存できません。
Regex pattern is unsafe: avoid nested quantifiers, ambiguous quantified alternatives, and oversized patterns.このメッセージが表示された場合は、パターンを短く、単純にしてください。次のような形を避けます。
- 1000文字を超えるパターン。
(a+)+のように、繰り返しのグループを別の繰り返しのグループの中に入れたもの。..や\s\wのように、範囲の広いワイルドカードを2つ続けたもの。範囲の広いワイルドカードとは、.、\s、\w+のように、いくらでも長い文字列に一致しうる書き方です。- 1つのパターンの中に範囲の広いワイルドカードが3つ以上あるもの。間に別の文字が挟まっていても同じです。
a+や(a+)のような単純な繰り返しや、.*を1つだけ使うような、範囲の広いワイルドカード1つは問題ありません。
安全なパターンでも、長いメッセージでは置換1回ごとに制限時間があります。あるスクリプトが1件のメッセージで時間がかかりすぎた場合、アプリはそのメッセージについてだけそのスクリプトを飛ばします。スクリプトはオンのままで、次のメッセージで再び実行されます。新しいパターンは、まず短いサンプル文章を使ってLive Testで試してください。
関連ガイド
- マクロ
- キャラクターの作成と編集
- SillyTavernからのインポート