DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

2023総まとめ:InDesignの正規表現にまつわるTips振り返り

今年もQiitaや他のアドカレを眺めながら、こんな盛り上がるコミュニティにいたら楽しかったなと思うこの頃です。
さて、12月ということで振り返りっぽい記事を書こうかと思います。今回は正規表現について、過去ブログに書いた内容も交えながらTipsとして放流したいと思います。

選言(|)の扱いがCC2014から変更された?

選言とは|のことです。A|Bとすれば、AにマッチしなければBという挙動になります。これがCC2014以降で挙動が変わりました。

InDesign CC2014から変更された正規表現? - DTPab

正直なところCC2014とかバージョンはどうでもよくて、選言を使う場合はスコープ(適用範囲)をしっかり定義するクセをつけようということです。

例として、下記の正規表現のどちらかをマッチさせたいとします。

  • ^\t\d(?=\.) (行頭タブ+数字かつピリオドの前)
  • ^\d{2}(?=\.) (行頭から数字2つかつピリオドの前)

この正規表現を選言を使って記述するとき、次の書き方ではうまくいきません(タブ・数字・ピリオドの並び以外のケースにもマッチしてしまう)。

^\t\d|^\d{2}(?=\.)

選言前の部分がうまく機能しない

これを正しくマッチさせるには、次のように選言の範囲を明確にする必要があります。

(^\t\d|^\d{2})(?=\.)

選言範囲を適宜グルーピングするとうまくいく

行頭マッチ^は外に出してもいいでしょう。

^(\t\d|\d{2})(?=\.)

これも同じ結果になります。

正規表現スタイルの初見殺し

正規表現スタイルではまともにマッチしない文字がいくつかあります。

  • 全角数字のみ\dとすると半角数字も全角数字もマッチする)
  • 全角スペース

これらは次の書き方でマッチさせましょう。

  • 全角数字:コードポイントを使う[\x{ff10}-\x{ff19}]
  • 全角スペース:メタ文字を使う~(

OSで区別される、見た目のわからない文字

OSによって入力される文字が異なり(見た目は同じでコードポイントが違う)、正規表現スタイルや検索ダイアログでは厳密に区別されるものがあります。それが次の2種類です*1

文字 macOSのコードポイント Windowsのコードポイント
マイナス記号「−」 \x{2212} \x{FF0D}
波ダッシュ「〜」 \x{301C} \x{FF5E}

このマイナス記号と波ダッシュは、正規表現スタイルだけでなく禁則処理も同様に区別されますので、OSをまたいで作業する環境にある場合は常に意識してデータを作りましょう。

囲み数字をコードポイントで制御する

丸数字や括弧数字にも、いまのフォントにはコードポイントが割り振られています(だいたい20くらいまである)。いつでも参照できるようにしておくとちょっと便利かもしれません。

InDesignの正規表現検索チートシート - DTPab

  • 丸数字(①〜⑳):[\x{2460}-\x{2473}]
  • 黒丸数字(❶〜⓴):[\x{2776}-\x{277f}\x{24eb}-\x{24f4}]
    (❶〜❿:[\x{2776}-\x{277f}]、⓫〜⓴:[\x{24eb}-\x{24f4}]
  • 括弧数字(⑴〜⒇):[\x{2474}-\x{2487}]
  • 時計数字(Ⅰ〜Ⅻ):[x{2160}-\x{216B}]

メタ文字.に改行文字も含ませるには

メタ文字.は普通改行文字を含みません。なので、段落を頭からお尻までマッチさせるには.+などとやりますよね。

改行を含ませたいとき、シングルラインモードにすると.が改行文字を含むようになります*2

(?s).+

行頭に付けた(?s)がシングルラインモードを示します*3

肯定後読みと\Kの使い分け

肯定後読み(?<=)は、指定した文字列が前にあるものをマッチさせる正規表現です。これの優秀なところは、指定の内側はマッチ文字列に含まれないというところですね。

例:「macOS」の後ろの数字にマッチさせる

しかし肯定後読みの難点は、文字長が可変する(文字数定まらないような)正規表現には対応できない点です。

繰り返しを示す「+」があるとマッチしない

この例では、肯定後読みの中の繰り返し+{2}として(?<=macOS \d{2}\.)\d+とすればマッチするわけですが、桁数が増えるか減るかわからないときには使えません。しかしこれを解消するのが\Kです*4
先ほどの正規表現を、肯定後読みを使わずに\Kを使って書き換えるとこうなります。

macOS \d+\.\K\d+

この文字列をひとまとまりとして検索し、マッチ結果は\K以降の部分になる、といったイメージです。\Kそれ自体は挿入点と近いイメージですね。
ただマッチ結果が飛び飛びになってしまうという不具合を抱えているため、前述のシングルラインモードと併記したほうが安心です。

InDesign正規表現 ^ と \K の組み合わせで不具合 - DTPab

桁区切りのカンマを挿入する正規表現

以前の記事で紹介したのはこちらです。

検索:(\d+?)(?=(\d{3})+(?!\d))
置換:$1,

正規表現の詳しい説明は過去の記事を参照ください。

InDesign Tips - 桁区切りのカンマを挿入する正規表現 - DTPab

空白文字・分割文字を示すメタ文字

InDesignには次のような便利なメタ文字があります。

メタ文字 意味
\h 水平方向(horizontal)の空白文字:「空白文字を挿入」から挿入できるすべてのスペースと、タブにマッチ
\v 垂直方向(vertical)の空白文字=分割文字:「分割文字を挿入」から挿入できる分割文字のうち、任意の改行以外にマッチ

ただし、\hは「右インデントタブ」にはマッチしません。

空白文字のリスト

分割文字のリスト

特殊なスペースや分割文字に簡単に対応できるのでおすすめです。

「漢字」を示す正規表現

InDesign 2023(v18.3)から漢字を示すメタ文字~Kが改善されました*5

とはいえ実際にどれくらいの漢字に対応しているのか? ものかのさんがブログ記事にまとめてくださっているので参照ください。

Unicodeで「漢字」の正規表現 – ものかの

InDesignの漢字のワイルドカード – ものかの

ものかのさんはInDesign 2023 v18でデータ検証くださっているので、僕は手元のInDesign 2024 v19で検証してみました。一応、そのときの資料がこちらで、結果は同じでした。
というわけで、2024 v19(記事では2023 v18)時点でのベストアンサーが下記です(記事から引用させてもらっています)。

[\x{2E80}-\x{2FDF}々〇〻~K\x{30000}-\x{3FFFF}]

アルファベットの検索

時々見かけますが、[a-zA-Z]という表記は基本的なアルファベットしか検索できません。いや、アルファベットしか、って他に何があるんだよって話ですが、あるんですよ。

Unicode一覧 0000-0FFF - Wikipedia

このあたりを見てもらうとわかりますが、かなり広範に「アルファベットと思しき文字」が偏在しています。例えばU+00dfの「ß」は、ドイツ語で使われるエスツェットです。
「正規表現でアルファベットをマッチさせたいな〜」というときに、言語によって[a-zA-Z]では漏れるものが出てくるわけですね。

InDesignでも\u\lというメタ文字が使えて、前者は大文字(upper caseの頭文字)、後者は小文字(lower caseの頭文字)を示します。これを利用すると、大抵の「アルファベットと思しき文字」はマッチさせることができます。実際にU+0020〜U+058fまで、正規表現スタイルを利用してテストした資料を置いておきます。

CC2018、2020、2022、2024で正規表現の\uと\lをテストした資料(画像はその一部)

資料を見ていただければわかりますが、資料はInDesignのバージョンごとに作成しています。というのも、InDesignもバージョンが変わると対応するUnicodeのバージョンが異なるためです。そのあたりも含めてぜひご覧ください(CC2018と2020以降とで結果が異なるのが確認できます)。

正規表現検索では検索できない文字

テキスト検索では検索できて、正規表現検索では検索できない、という特殊な文字がいくつかあります。例えば、U+FEFFという制御文字や、表組自体(文字、と言っていいのか?)です。

対象の文字 検索文字列
U+FEFF <feff> (大文字小文字問わず)
表組 <0016>

前者は、InDesignでは索引、相互参照、XMLタグ、注釈など、不可視で文字幅が存在しては困る機能に利用されています。ただマイクロソフト製品のデータをInDesignに取り込んだ際に紛れ込むことがあり、CC2018以前は文字組みアキ量をバグらせる困った存在でした*6
特に相互参照はぱっと見ただけでは(相互参照パネルを開いていない限り)気づけません。マイクロソフト製品から紛れ込んだものだと思って消してしまうと本来参照していたもの(例えばノンブルなど)がリセットされてしまうので、くれぐれもご注意ください。

後者は、表組それ自体を検索できます。DTPの作業中に表組を検索することなんてほとんどありませんが、スクリプトなんかでストーリー上にいる表組を特定したいとかそういうニッチなケースでたまに役立ちます。覚えておいて損はないけど特に得もしない情報です。

まとめ

あれこれまとめてきましたが、ここまでInDesignの正規表現についてまとめたのは初めてかもしれません。特にバージョンが新しくなってからはないかも。
結局のところ、下記に収束されると思います。

  • InDesignのバージョンアップにより、メタ文字の対応範囲や、正規表現エンジンが更新される可能性があるので注意する(知っておくだけでもいいと思う)
  • それらの検証を個人で行うのは困難なので、ものかのさんいつもありがとうとものかのさんに足を向けて寝ない

以上、正規表現まわりの現状のまとめでした!

*1:僕が把握しているものがこの2種類、ということです

*2:InDesignは特に指定しない限りマルチラインモード(?m)が付いていると思ってもらっていいです

*3:余談。グルーピングの先頭に?をつけると、グループ参照の対象から外れます=( )で括っているのに$1などで参照できなくなります

*4:これなんか名前ないの?

*5:InDesign v18.3リリースノート参照

*6:CC2018から不具合は解消されていますが、こちらの記事を参照:制御文字U+FEFFによるアキ量の無効化 - DTPab