先日、「正規表現」というめちゃくちゃ便利なテクニックを知りました。
以下、正規表現をノベルゲームのシナリオスクリプト作業に応用してラクする方法を、「NScripter→ティラノビルダー」を例にしてメモがてらまとめていきます。
置換を試す前には必ずバックアップを。(ミスって保存しちゃったら目も当てられないので)
この記事の目次
正規表現とは
参考にさせて頂いた記事「サルにもわかる正規表現入門」

↑詳細はこちらで。
自分なりの正規表現の解釈としては、「文字列を記号でパターン化して、便利に置換するテクニック」という風に考えてます。
【基本】正規表現がいらない置換の例
背景表示を置換する
//元テキスト csp -1 bg "bg\usaginome.jpg",21 //置換後テキスト [bg time="1000" method="crossfade" storage="event_cg/usaginome.jpg" ]
「usaginome.jpg」がわかりやすく共通なので、その前後で切り分けます。
つまり「csp -1 bg “bg\」→「[bg time=”1000″ method=”crossfade” storage=”event_cg/」、「”,21」→「” ]」とすればOK。
ただしこれは、「前後」が固有の文字列だからこそ可能な置換にすぎません。
【応用】正規表現を使った置換の例
自分は「Mery」というテキストエディタを使っています。
なお、正規表現の置換は、有名どころのテキストエディタならまず問題なくできます。「置換」機能に「正規表現」というチェック項目がないか確認してみてください。
一部の空行を削除する
NScripterの場合、「br」と打つことでテキスト中に空行を表現できます。
//NScripterの場合 白ウサギの目は赤い。 br 目が赤く見えるのは、虹彩に色素が全く無いからだ。 そのせいで目の奥の毛細血管が透けて、赤く見える。 br つまりは――――血の色。
ティラノビルダーの場合、「[r]」で同じことができますが、空行にも一瞬だけクリック待ちアイコンが表示されてしまう仕様があります。(回避方法あるんですかねこれ)
この仕様がどうも気になったので、ティラノビルダーではテキスト中の空行を削除し、必ず行間を詰めることにした。
そして改行は、正規表現によって表すことができる。
参考にさせて頂いた記事

エディタで文章を保存する時に、大抵は「改行コード」を選択できる。
自分の環境では、改行の正規表現は「\n」となります。(ほかのパターンは上記記事やエディタの仕様を確認)
//検索する文字列(正規表現で) br\n //置換後の文字列
「置換後の文字列」を空白にすることで、置換後を空白に────つまり削除できます。
ウェイトを置換する
//元テキスト !d1000 //置換後テキスト [s_wait time="1000" ]
↑のような場合、「前後で切り分ける」ことは難しいです。
「!d」部分はカンタンですが、「1000」の後ろがどうしようもない。仮に「改行」や「0」などで置換すると、他の共通部分もすべて置換されてしまうことになる。
なのでこれは、正規表現を使います。
//検索する文字列 !d(\d+) //置換後の文字列 [s_wait time="$1" ]
↑なんのこっちゃ。
大丈夫、じつはそんなに難しくない。
正規表現は、ただのパターンの組み合わせです。
そのパターンを解きほぐせば、じつは相当カンタンで、相当便利な「置換テクニック」であると思います。(正規表現を知らない自分でも1日で「浅く使える」ようにはなった)
以下、ひとつひとつバラバラにして解説します
参考にさせて頂いた記事

すべての半角数字を表す「\d」
//検索する文字列 !d(\d+)
ちょっとややこしいんですが、「!d1000」の「d」とはまったくの無関係です。こっちはただの「d」という文字。
「\d」は、正規表現で「すべての半角数字」という意味になります。
つまり今回の場合、「1」の部分に該当します。
直前パターンの1回以上の繰り返しを表す「+」
すべての半角数字を表す「\d」と、直前パターンの1回以上の繰り返しを表す「+」を併用、「\d+」とすることで、正規表現で「1000」を表すことができます。
つまり、「すべての半角数字が、1回以上繰り返されてますよー」って表現ですね。これで検索すると、「あらゆるケタの半角数字の羅列」がヒットします。
「()」で囲われた部分を「」で置き換えられる
これで、シメです。
//検索する文字列 !d(\d+) //置換後の文字列 [s_wait time="$1" ]
「()」で囲まれた「\d+」の部分は、「$1」を使うことで、置換後の文字列のところに引っぱってこれます。
なお「()」が複数ある場合、「$1」「$2」「$3」としていくことで、すべて表せます。
便利すぎる……。
以上で、ウェイト「!d1000」部分の置換解説はおわりです。
参考にさせて頂いた記事

BGM再生を置換する
//元テキスト bgm "bgm\01.ogg" //置換後テキスト [playbgm time="1000" loop="true" click="true" storage="01.ogg" ]
これ、背景表示みたく「前後の切り分け」でいけそうなようにも見えますが、「ogg」形式がBGMだけでなくSEにも使われているため、干渉してしまいます。
なのでこれも、正規表現を使います。
//検索する文字列 bgm "bgm\\(\d+).ogg" //置換後の文字列 [playbgm time="1000" loop="true" click="true" storage="$1.ogg" ]
↑ほぼウェイトの時と同じ要領ですが、一点だけ新たなテクニックがあります。
「\\」の部分です。
これは、元テキストに「\」という「メタ文字」が使われており、正規表現と干渉してしまうため、その干渉を防ぐためのテクニックになります。
「\」でエスケープ
「\」を直前に置くことで、「メタ文字」と呼ばれる「プログラム上意味があって使えない文字」をエスケープ────つまり通常の文字として認識させることができます。
つまり、正規表現で「\\」と書けば、直前の「\」は省略され、単純な文字の「\」として認識してくれるわけです。
ルビをすべて削除する(追記アリ)
ティラノビルダーは吉里吉里方式のルビ振りを採用しています。
で、これが曲者で、どうしようもない(たぶん)。
たとえば「臥薪嘗胆」にルビを振りたいとすると、NScripterや一般的な記法の場合は「(臥薪嘗胆/がしんしょうたん)」のようにすれば大ざっぱにルビを振れます。
ですが吉里吉里方式の場合は、「[ruby text=が]臥[ruby text=しん]薪[ruby text=しょう]嘗[ruby text=たん]胆」とする必要がある。
これ正規表現がどうとかいうレベルじゃ置換できないですよね……?
なので、ルビは一旦すべて削除することにしました。
//検索する文字列 \(([一二三四五六七八九十壱弐参拾百千万萬億兆亜-黑]+)/[ぁ-ん]+\) //置換後の文字列 $1
「(」と「)」はメタ文字なので、「\」を直前に置くことでエスケープさせます。
「[一二三四五六七八九十壱弐参拾百千万萬億兆亜-黑]」は、「漢数字+ほか全ての漢字(Shift-Jis)」を表します。
「[ぁ-ん]」は、「全てのひらがな」を表します。
あとは「()」で漢字部分だけを囲って、「$1」でその部分を残して置換すればOKです。
……ルビ振りは手作業でがんばります(ルビプラグイン誰か作って……)。
↑上記の手段ではすべての漢字に対応していないようです。
追記。エディタ「Mery」は「鬼車」という正規表現を使用しているようです。漢字は「\p{Han}」、ひらがなは「\p{Hiragana}」となります。
参考にさせて頂いた記事

なので正しくは、
//検索する文字列 \((\p{Han}*)/\p{Hiragana}*\) //置換後の文字列 $1
あるいはもっとシンプルに、
//検索する文字列 \((.*)/(.*)\) //置換後の文字列 $1
とすればいいと。なお「*(アスタリスク)」は「直前のパターンの0回以上の繰り返し」という意味です。
クリック待ちを含む改行・改ページを置換する
//元テキスト 白ウサギの目は赤い。 目が赤く見えるのは、虹彩に色素が全く無いからだ。 そのせいで目の奥の毛細血管が透けて、赤く見える。 つまりは――――@ 血の色。\ //置換後のテキスト 白ウサギの目は赤い。[l][r] 目が赤く見えるのは、虹彩に色素が全く無いからだ。[l][r] そのせいで目の奥の毛細血管が透けて、赤く見える。[l][r] つまりは――――[l][cm] 血の色。[l][cm]
NScripterは「。」や「」」で自動的に改行できますが、ティラノビルダーは改行タグ「[r]」をその都度入れる必要があります。(NScripterには事前に改行文字を設定するデフォルト機能がある。なお文字直前に「_」でエスケープできる)
また、NScripterは「。」「」」で自動的にクリック待ち判定になりますが、ティラノビルダーはその都度クリック待ちタグ「[l]」を入れる必要があります。
これらは数段階で置換していきます。(もっと上手い短縮方法あるかもですが)
//検索する文字列 ([。」])(\n) //置換後の文字列 $1[l][r]$2
↑のようにすることで、改行を含む「。」と「」」が「。[l][r]」「」[l][r]」のように置換されます(カッコがごちゃごちゃしててわかりづらいですが)
復習ですが、最初の「()」の部分は「$1」で表され、二つ目の「()」の部分は「$2」で表されます。
そして「\n」が改行の正規表現を表しています(改行コードやエディタの仕様によって異なる)。
これが第一段階。
//検索する文字列 \\\n //置換後の文字列 [l][cm]
これも復習ですが、直前に「\」を入れることでメタ文字である「\」をエスケープし、そのままの文字として読み込ませます。
あとはふつうに置換すればOK。
これが第二段階。
//検索する文字列 @\n //置換後の文字列 [l][r]
NScripterは改行文字を予め設定しなかった場合、「@」で改行させられます。つまり「@」も置換する必要がある。
これが第三段階。
//検索する文字列 (.)@(.) //置換後の文字列 $1[l]$2
「.(ピリオド)」で、「任意の一文字」という意味になります。
これで、前後を文字で挟まれた「@」を、「[l]」に置換できる。
これが第四段階。
だいたいこれで、クリック待ち・改行周りの置換は完了。
[tb_start_tyrano_code][_tb_end_tyrano_code]は半分手作業で
ティラノスクリプトは、もうここまでの方法でほとんど置換できると思います。
ただティラノビルダーの場合、「[tb_start_tyrano_code]」と「[_tb_end_tyrano_code]」で各セクションを囲わないと、区切りがぐちゃぐちゃになってしまいます。
//検索する文字列 (\[l\]\[cm\]\n) //置換後の文字列 $1[_tb_end_tyrano_code]\n\n[tb_start_tyrano_code]
↑このようにすることで、テキスト後の改ページ「[l][cm]」の後ろに、改行を含んだ「[tb_start_tyrano_code]」と「[_tb_end_tyrano_code]」」を挿入し、セクションごとに分けることができます。
ただし、空行がどうしてもできてしまうので、そこは上手いこと調整する必要があるかなと。
細かい部分は手作業で
言わずもがな、正規表現だけで「完全に」移植/置換するのは難しいと思います。
ただ、ここまでの流れでもうほとんど置換できてますし、細かい部分は手作業といっても(ぜんぶ手作業に比べれば)それほど苦行ではないはずです。
一気に置換したい時のフリーソフト
フリーソフト「複数行置換」

↑名前そのままに、複数行を一気に置換できます。
まとめ

長いよッ!

正規表現はパターンさえ覚えればカンタンだけど(浅いレベルは)、そのパターンがけっこうあるからなぁ

でもまぁ……ぜんぶ手作業でやるよりは遥かにラクチンだね。正規表現の仕組み考えたヒトスゴい!
正規表現のおかげで、置換作業がめちゃくちゃラクになりました。
ノベルゲ以外にもいろいろ活用できそうっすね。便利便利。
今回は以上です。良き置換ライフを────ではまたφ(・ω・ )



