DTPab

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

InDesign 16.2 でアップデートされた正規表現がおかしい?

f:id:uske_S:20210519123815p:plain

先日アップデートされたInDesign 16.2(2021)ですが*1、正規表現検索置換にアップデートが入りました*2

これまで、「行頭」という位置を表す^という正規表現は検索でだけ機能していました。それが16.2から置換としても正しく機能するというのが今回のアップデート……のはずでした。試してみたところいくつか不具合と思しきものを見つけたので、それらをまとめたエントリーです。

空の改行が挟まると正しい結果にならない

アップデート直後、ものかのさんがツイートしてくださっていました。

一応、これへの対応策としてシングルラインモードで検索する方法を提案しました。

シングルラインモードで検索を行うと.という正規表現が改行文字も含むようになります。これを応用して^でも改行文字へしっかり対応できるだろうと考えたわけです。
なので、当面の最適解としてはシングルラインモード(?s)を付けて運用するのが良いかと思います。

位置を表すほかの正規表現ではどうか

以下は「行末」を表す$、「ストーリーの最後」を表す\Z、「単語境界」を表す\bをなどを試してみました。それぞれの正規表現を検索文字列に、置換文字列はだけです。

$で検索置換

f:id:uske_S:20210519141329p:plain
$の置換結果

やっぱり空の改行にはマッチしていません。

f:id:uske_S:20210519143657p:plain
シングルラインモードで$を置換した結果

シングルラインモードを使う((?s)$)とうまく置換できました。

\Zで検索置換

f:id:uske_S:20210519141528p:plain
\Zの置換結果

この条件ではうまくマッチした…のですが、ストーリーの最後の文字が改行文字だとやはりうまくいきません。また、\Zについてはシングルラインモードを使っても結果は同じでした。

\b\<で検索置換

f:id:uske_S:20210519142032p:plain
\bの置換結果

何もマッチしませんでした。このほかに、単語の始まりを示す\<も同様何もマッチしません。改行文字による不具合ではなさそうなのでシングルラインモードにしたところで当然何もマッチしません。

なぜかマッチする\>

一方、単語の終わりを示す\>では正しくマッチしました。

f:id:uske_S:20210519142251p:plain
\>の置換結果

この挙動はちょっと不思議ですね。

表組での挙動

今回のアップデートで、僕個人的には表組での使い勝手が良くなったのではと期待しています。空のセルに文字列を追加することは検索置換ではこれまでできなかったからです。
以下は、表組のセル全体を選択して検索置換した結果です。

^で検索置換

f:id:uske_S:20210519144554p:plain
表組での^の置換結果

おおー。これは期待通り。

$で検索置換

f:id:uske_S:20210519144804p:plain
表組での$の置換結果

ん? 右下のセルでうまくいっていない。

\Zで検索置換

f:id:uske_S:20210519145102p:plain
表組での\Zの置換結果

こちらはセル相手ではうまくマッチせず。

$では右下のセルだけマッチできない?

先ほどの件を追加検証してみます。黒く反転しているところが選択範囲で、その範囲を対象に検索置換しました。

f:id:uske_S:20210519145257p:plain
前の2列を選択して検索置換

図のように、これは意図通りの結果になりました。となると、末尾のセルだけうまくいかないのかな?

f:id:uske_S:20210519145557p:plain
右下の4つのセルを選択して検索置換

どうやらこの仮説は正しいっぽい。

f:id:uske_S:20210519145750p:plain
連結したセルがある表組で検索置換

右下のセルを縦に連結したら今度は左下がうまくいっていない。なーるほど、もうわかった。スクリプトで表から個別のCellオブジェクトを拾う際と同様、表の最後になるセルにうまくマッチしないようです。

今回のエントリーはこの不具合について調べたいわけではないので(自分なりに理解できたし)これ以上深追いしません。結果としては表組相手に$を検索条件にするときは注意してね、ということですね。

まとめ

  • ^をだけを信じろ
  • シングルラインモードを使いながら意図した結果になるか慎重に試そう

16.2では、この他にも字形の検索置換の不具合なども直っています。アップデートするのがいいと思いますが、こういうことがあるのでうまく付き合っていきたいですね。

余談

シングルラインモードで改行文字列がマッチすること自体、あまり広くは知られていないかもしれません。

(?s).

この正規表現の(?s)部分は、置換で用いるグループ参照($0$1など)に参照されません。もともとは(? )という正規表現の応用で、これはグルーピングのために()を使うけど参照しない、というものです。置換で用いる$0などは$9までしか参照できませんので、グループ参照の節約のためになのか、こういう抜け道が作られています*3

そして実は、InDesignでもいつのバージョンからか書記素クラスタが使えるようになっています。

\X

書記素クラスタについては詳しく説明できない*4のですが、この正規表現自体は改行文字列も含めてマッチします。気になった方はぜひ調べてみてください。

*1:なお、記事執筆時点の最新は16.2.1。このドットバージョンは、PNGやJPGを書き出すと黄色い線が現れるという不具合への対処らしいです

*2:元となったユーザーボイスはここ:
Serious problem of "^" for GREP search – Adobe InDesign

*3:ほかにも、前方・後方一致としての (?<=) や (?=) などもそうですね

*4:詳細はユニコードの書記素クラスタ(grapheme cluster)に関するテクニカルレポートを参照のこと(英語)