先日アップデートされたInDesign 16.2(2021)ですが*1、正規表現検索置換にアップデートが入りました*2。
これまで、「行頭」という位置を表す^
という正規表現は検索でだけ機能していました。それが16.2から置換としても正しく機能するというのが今回のアップデート……のはずでした。試してみたところいくつか不具合と思しきものを見つけたので、それらをまとめたエントリーです。
空の改行が挟まると正しい結果にならない
アップデート直後、ものかのさんがツイートしてくださっていました。
空行が2行以上ある箇所じゃなく「空行がからむと正常に置換されない」だね。 pic.twitter.com/H9sskrqE5g
— ものかの (@monokano) 2021年5月12日
一応、これへの対応策としてシングルラインモードで検索する方法を提案しました。
シングルラインモードを使うことで「すべて置換」でもうまく動作しました。ただこれはシングルラインモードの意味がなくなるのでいずれのケースも不具合といえますね。 pic.twitter.com/wxBP80McSF
— Yusuke S. (@Uske_S) 2021年5月12日
シングルラインモードで検索を行うと.
という正規表現が改行文字も含むようになります。これを応用して^
でも改行文字へしっかり対応できるだろうと考えたわけです。
なので、当面の最適解としてはシングルラインモード(?s)
を付けて運用するのが良いかと思います。
位置を表すほかの正規表現ではどうか
以下は「行末」を表す$
、「ストーリーの最後」を表す\Z
、「単語境界」を表す\b
をなどを試してみました。それぞれの正規表現を検索文字列に、置換文字列は〓
だけです。
$
で検索置換
やっぱり空の改行にはマッチしていません。
シングルラインモードを使う((?s)$
)とうまく置換できました。
\Z
で検索置換
この条件ではうまくマッチした…のですが、ストーリーの最後の文字が改行文字だとやはりうまくいきません。また、\Z
についてはシングルラインモードを使っても結果は同じでした。
\b
、\<
で検索置換
何もマッチしませんでした。このほかに、単語の始まりを示す\<
も同様何もマッチしません。改行文字による不具合ではなさそうなのでシングルラインモードにしたところで当然何もマッチしません。
なぜかマッチする\>
一方、単語の終わりを示す\>
では正しくマッチしました。
この挙動はちょっと不思議ですね。
表組での挙動
今回のアップデートで、僕個人的には表組での使い勝手が良くなったのではと期待しています。空のセルに文字列を追加することは検索置換ではこれまでできなかったからです。
以下は、表組のセル全体を選択して検索置換した結果です。
^
で検索置換
おおー。これは期待通り。
$
で検索置換
ん? 右下のセルでうまくいっていない。
\Z
で検索置換
こちらはセル相手ではうまくマッチせず。
$
では右下のセルだけマッチできない?
先ほどの件を追加検証してみます。黒く反転しているところが選択範囲で、その範囲を対象に検索置換しました。
図のように、これは意図通りの結果になりました。となると、末尾のセルだけうまくいかないのかな?
どうやらこの仮説は正しいっぽい。
右下のセルを縦に連結したら今度は左下がうまくいっていない。なーるほど、もうわかった。スクリプトで表から個別のCell
オブジェクトを拾う際と同様、表の最後になるセルにうまくマッチしないようです。
今回のエントリーはこの不具合について調べたいわけではないので(自分なりに理解できたし)これ以上深追いしません。結果としては表組相手に$
を検索条件にするときは注意してね、ということですね。
まとめ
^
をだけを信じろ- シングルラインモードを使いながら意図した結果になるか慎重に試そう
16.2では、この他にも字形の検索置換の不具合なども直っています。アップデートするのがいいと思いますが、こういうことがあるのでうまく付き合っていきたいですね。
余談
シングルラインモードで改行文字列がマッチすること自体、あまり広くは知られていないかもしれません。
(?s).
この正規表現の(?s)
部分は、置換で用いるグループ参照($0
や$1
など)に参照されません。もともとは(? )
という正規表現の応用で、これはグルーピングのために()
を使うけど参照しない、というものです。置換で用いる$0
などは$9
までしか参照できませんので、グループ参照の節約のためになのか、こういう抜け道が作られています*3。
そして実は、InDesignでもいつのバージョンからか書記素クラスタが使えるようになっています。
\X
書記素クラスタについては詳しく説明できない*4のですが、この正規表現自体は改行文字列も含めてマッチします。気になった方はぜひ調べてみてください。