Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2011-04-02

[][][][][]InDesign正規表現では、後読みに繰り返しや選択が使えない

InDesign正規表現で、後読み(戻り読み)には繰り返しや選択が使えません。これはInDesign正規表現の仕様です。たとえば下図のようなキャプションの「●」だけに文字スタイルを適用したいときを考えてみましょう。

f:id:seuzo:20110402154921p:image

最初に思いつくのはこんな正規表現です。

(?<=^図\d?\d)●

しかし、マッチしません。「(?<=^図\d+)●」なども同様です。後読みの中では繰り返しは使えません。

正規表現クックブックのP95「後読みのさまざまなレベル」に少し解説がありました。ちょっとだけ引用します。

正規表現ソフトウエアは、テキストを左から右に探すように設計されてきました。多くの場合、後読みはちょっとしたハックとして実装されています。後読みに書き込まれた文字数を計算し、その字数分だけ後戻りし、後読み内のテキストと対象テキストを左から右に比較するのです。

要するに、基本的には後読み内のテキストは固定長でなければならないってことです。*1


後読み中の選択

今度は、選択を使ってこんな正規表現を試してみます。

(?<=^図\d\d|^図\d)●

これだと、2桁の数字の後ろの●だけにマッチします。1桁の後ろの●にはマッチしません。選択の順序を入れ替えて(?<=^図\d|^図\d\d)とすると、1桁の後ろの●にだけマッチすます。これもやはり選択が正しくサポートされていないのでしょう。*2

後読み中の選択をサポートしている言語、たとえばRuby1.9*3で下記のように書いた時は正しく動作します。

p /(?<=^図\d\d|^図\d)●/ =~"図2●ほげほげ" #=>2
p /(?<=^図\d|^図\d\d)●/ =~"図2●ほげほげ" #=>2
p /(?<=^図\d\d|^図\d)●/ =~"図18●ほげほげ" #=>3
p /(?<=^図\d|^図\d\d)●/ =~"図18●ほげほげ" #=>3

解決策

とりあえず、こんな感じで解決してみました。

(?<=^図\d\d)●|(?<=^図\d)●

f:id:seuzo:20110402165021p:image

この正規表現スタイルをもった段落スタイルを適用すれば、●文字だけが文字スタイル適用になったのがわかります。

f:id:seuzo:20110402165022p:image

この場合だけに限れば、先頭文字スタイルを使っても解決するかもしれません。しかし、正規表現スタイルは先頭文字スタイルよりも格段に扱いやすいので、いろいろなバリエーションを習得すると吉でしょう。

*1:ただし、これは実装によるので、Java.NET Frameworkでは量指定子が使えるようです。

*2:選択が未サポートだとしたらエラーになるはずなので、もしかしたらバグかもしれない

*3:1.8系は後読みをサポートしません

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/seuzo/20110402/1301732490
Connection: close