はじめに:正規表現で考えたら、スクリプト化が最適解だった話
前回までは、検索・置換の中で完結する正規表現の例を紹介しました。
ただ、作業内容によっては「正規表現で探すことはできるけど、置換まで一気にやるのは難しい」というケースもあります。
今回ご紹介する「特定条件のときだけ、単位を1字字形に変換する」という作業も、まさにそのひとつでした。
最初は「正規表現でなんとかならないかな?」という軽い思いつきだったのですが、結果的にスクリプト化するのが一番安全で早いという結論に落ち着きました。
ここでは、その考え方の流れと、なぜ自動化に向いていると判断したのかをまとめます。
きっかけ:縦組みでの単位表記ルール
ある案件で、こんな指示がありました。
「mm / mg / kg などの単位は、1字字形(㎜ / ㎎ / ㎏…)にする」
DTPではたまに出てくる指示ですね。
InDesignでは、単位を見つける→字形パネルから1字字形を見つけて選んで手作業で置き換える、という工程を踏む必要があり、数が多いとどうしても時間がかかります。
だけど、一括変換で単純に「mgをすべて1字字形にする」ということはできません。
たとえば「img」のような単語があった場合、意図しない変換が起きてしまうからです。
一方で、「1mg/m」のような表記は問題ありません。
この場合に避けたいのは「前後に英字が続くとき」だけで、前後が数字や記号であれば字形にしてOKです。
つまり条件はこうです。
- 対象は mg / kg / mm / cm などの「単位」
- 前後に英字が続く場合は除外したい
- 数字や記号に挟まれている場合は変換したい
まずは正規表現で考えてみる
条件がかなり限定されているので、これは正規表現で探せそう!
実際、「前後に英字が来ない『mg』」といった条件で検索すること自体は、正規表現で問題なく可能でした。
「数字の直後にある単位だけを対象にする」ために後読みを、
「英単語の一部になっているものを除外する」ために否定の先読みを使えばいいのです。
ただ、ここでひとつ問題があります。
InDesignの「検索/置換」では、置換欄に指定できる字形は1種類だけです。
InDesignでは、
- 正規表現でヒットさせること
- 実際に「どんな文字に置き換えるか」
は別問題になります。
今回のように
- 単位は複数ある
- しかもそれぞれ置換先の字形が異なる
というケースでは、置換は1パターンずつ必要になります。
発想を切り替える:「処理」をスクリプトに任せる
どうしようかなと悩みながらChatGPTに相談すると、「スクリプトがいいんじゃない?」と提案されました。
ChatGPTが言うには、この作業は自動化にとても向いているようです。
- 単位の種類は決まっている
- 置換先はすべて「別々の1字字形」
- 単位の前後条件はほぼ共通
- 使用フォントも確定している
ということで
- 正規表現 → 条件を定義するために使う
- 実際の処理 → スクリプトに任せる
これならたしかに、スクリプトにできそうです…!
スクリプト化したことで得られたもの
実際のやり取りは割愛しますが、最終的に作ったのは、こんな動きをするシンプルなスクリプトです。
- JSXファイルで保存してScripts Panelから使う
- 選択範囲があれば、そこだけ処理
- 選択がなければ、ドキュメント全体を処理
- 変換したい単位を登録
- 先にmm2 → 次にmm のように干渉が起きない順番で置換
- 英単語の一部の場合は絶対に触らない
- Cmd+Zで元に戻すことも可能

(スクリプトの一部抜粋)
しかも、あとから自分で単位を追加することもできる作りにしてくれたので、とっても使い勝手がいいです。
ChatGPTが登場した当時は、スクリプトを作ろうと試してもなかなか順調に完成までいきませんでしたが、最近の進化はすさまじく、一発で作り上げてくれました。
(それどころか、すごく自信家で、いざスクリプト作成の段階になると「準備はできていますので「はい、お願いします」とだけ返信ください!」とまで言われてドキドキしました。笑)
今回感じたのは、「正規表現にできそうなところを探す」こと自体が、結果的に大きな時短につながるということです。
たとえ正規表現で完結しなくても、考え方はそのまま自動化に活かせる。
そんな実例になりました。
まとめ
「正規表現一覧表」を見ても、いまだにしっかりインプットできないわたしですが、日々の業務の中で、まずは「正規表現で便利にならないか?」「正規表現で条件を整理できないか?」を考えてみます。
実際、対象となるものがあった方が、正規表現の道が広がって見えてきます。
ただの記号の羅列にしか見れなかった正規表現のメタ文字が、「これ使えそうだな」って必要なパーツの一部に見えてくると楽しくなるので、どんどん挑戦していきましょう!



