DTP作業者にとっての難易度 ★★★★☆(4)
今まで「正規表現スタイルを使うと複雑な書式指定作業も簡単に処理できる」という例をご覧いただきました。しかし反対に「簡単そうに見えて意外と難しい」というケースもあります。今回は、そんな例を1つご覧いただこうと思います。
私がいただいた仕事で「本文中の括弧書き部分のみ文字サイズを変えてほしい」という指示を受けたことがあります。下図は、設定前の状態です。

特に設定しないと最長一致になる
正規表現スタイルを使えば、簡単に設定できそうに思い、まずは以下のように設定してみました。

『テキスト』欄は(.+)と設定しました。(と)は、それぞれ全角の起こし括弧(始め括弧)と受け括弧(終わり括弧)です。.は任意の文字、+は1回以上の繰り返しという意味です。この設定で下図のような状態になりました。
※分かりやすいよう文字サイズだけではなくフォント、文字色も変更しています。

これで一件落着……かというと、残念ながらそうではありませんでした。1つの段落内に括弧でくくられた箇所が複数存在すると、下図の「さしすせそ」部分のように不要な箇所まで書式が変わってしまうのです。

正規表現では、特に指定をしない限り「最長一致」という処理がおこなわれます。「条件に合っている限り、できるだけ長い範囲を処理対象にする」ということです。今回の例でいえば、最初の起こし括弧(「か」の前の起こし括弧)から、最後の受け括弧(「と」の後の受け括弧)までが一連の処理対象となってしまうのです。
最短一致を設定する
これを解決するために、下図のように『テキスト』欄を(.+?)と設定してみました。

繰り返しを意味する+の後に?を入力すると「最短一致」という処理がおこなわれます。今回の例で言えば、最初の起こし括弧(「か」の前の起こし括弧)から最短の位置に存在する受け括弧(「こ」の後の受け括弧)までが1つの処理対象となります。同様に「た」の前の起こし括弧から「と」の後の受け括弧までも1つの処理対象となり、下図の状態になります。

これで万事解決……かと思いましたが、残念ながらそうではありませんでした。
下図のように括弧書きの中に括弧書きが存在するようなケース(階層を成しているケース)では「最短一致」で希望通りの結果を得ることはできないのです。

私なりの設定
いろいろ考えた結果、私が考えた設定は以下の通りです。この設定で三階層の括弧書きまでは問題なく処理できると思います。

『テキスト』欄は([^()]*(([^()]*(([^()]*)[^()]*)*)[^()]*)*)と設定しました。下図は、この設定を適用した結果です。DTP作業者の皆さまは最下部のサンプルデータでお試しください。

この設定についてのご説明は少し複雑で長くなりますので、ここで詳しくはご紹介いたしません。
一階層であれば([^()]*)、
二階層までであれば([^()]*(([^()]*)[^()]*)*)、
三階層までであれば([^()]*(([^()]*(([^()]*)[^()]*)*)[^()]*)*)ということからお考えいただければと思います。
※[^()]*は「(と)を除く文字」を「0回以上繰り返す」という意味です。
このように正規表現スタイルの設定に頭を抱えるケースは多々あります。編集者のみなさま、ぜひDTP作業者と話し合って設定の難易度を確認し、十分な準備時間をお与えいただきたく思います。一度しっかりした設定が整えば、その後の作業効率は格段に向上するはずです。
※プログラム的な素養のない私は頭を抱える場面が多く、今まで多くの先輩諸氏のノウハウをインターネット上で吸収してまいりました。これからも様々な場で情報を交換していきたいと思います。また、もっと良い設定があるという方は、何とぞご教示ください。よろしくお願いします。
サンプルデータはこちら《minimum0624.zip》です(CS4以降)。
(0624追記)
市川せうぞーさんが【正規表現の文字クラスまとめ - 名もないテクノ手】で「否定文字クラスを使うときには、明示的に……改行を含むように習慣付けましょう。」とお書きになっているのを読み、これから心がけようと思いました。今回の例では起こし括弧と受け括弧が複数段落に分かれるケースは少ないと思われますが、念のため改行「\r」も記述しておいたほうが良いように思います。その場合、設定は([^()\r]*(([^()\r]*(([^()\r]*)[^()\r]*)*)[^()\r]*)*)となります。また、いろいろと試しているうちに、もう少し文字数の少ない記述方法もあることに気付きました。
一階層であれば([^()\r]*)、
二階層までであれば(([^()\r]|([^()\r]*))*)、
三階層までであれば(([^()\r]|(([^()\r]|([^()\r]*))*))*)といった設定です。
他にも、良い記述方法があればお知らせいただけると嬉しいです。
括弧処理の正規表現ですが、
あいうえお(かき(●●●)さしすせ(●●●)つて)となに(ぬねの(●●●)へほまみ(●●(●●●)●●)るれ)ろわゐゑをん
の様な括弧にもヒットするのですが、これは仕方ないのですか。宜しくおねがします。
今回は括弧書きの1階層から3階層まですべてを対象にするという例でしたので、
サンプルデータに上記の文字列を貼り付けると
(かき〜つて)
(ぬね〜るれ)
が赤い文字になると思います。
ご質問は
●●●
の部分はヒットさせたくないということでしょうか?
単純に見本画像の0624-06.pngの様な
1階層は(●●)
2階層は(●●(●●)●●)
3階層は(●●(●●(●●)●●)●●)
のみヒットさせたいのですが。
宜しくおねがします。
([^()\r]*(([^()\r]*(([^()\r]*))*[^()\r]*))*[^()\r]*)