強調表示の検索条件に正規表現を使用し、括弧で囲まれた文字列を括弧の種類ごとに色分け表示する
投稿するにはテキストデータを作成する必要があります。そのためにはテキストエディタを使用していますが、その中で間違いが多かったのが括弧の閉じ忘れでした。会話の終わりを表す括弧を付け忘れや、対応しない閉じ括弧を使用してしまうなど、後から探しづらい間違いを多くしてしまいました。間違いを後から探す手間と、間違えないようにする手間とでは、明らかに後者のほうが手間が少なくてすみます。砂の中からガラス片を探す手間よりも、ガラス片を落とさないようにするほうが楽なのと同じです。ですので、間違えないようにする方法、あるいは、間違えてもすぐにわかる方法はないだろうかと考えました。
現在使用しているテキストエディタは、プログラミング(ここでは『ソースコードの作成』の意)にも使用可能なものですので、そのための支援機能が幾つか実装されています。そのうちの一つの機能が「ある特定の文字列の強調表示」でした。この機能は、各種プログラミング言語で予約されている特定の文字列(if、else、など)を目立たせるためのものです。また、強調表示させるための文字列を独自に設定することも可能です。強調表示は画面表示上だけの変更だけですので、制御文字を埋め込まれるなどのことはなく、テキストデータそのものに変更を加えるわけではありません。作成したテキストデータをそのまま投稿しても特に問題は無いので、この機能を試すことにしました。
原稿では、通常の会話(声を出す会話)と通常ではない会話(声を出さない会話)とを使用していたので、これらを色分けすることを考えました。ある程度試行錯誤の末、辿り着いたのが以下の二つでした。
・通常の会話(声を出す会話)を表す正規表現:
「[^(].*?[^)]」
文字列の例:「これはテストです」
・通常ではない会話(声を出さない会話):
「(.*?)」
文字列の例:「(これはテストです)」
通常の会話(声を出す会話)を表す正規表現の意味は以下のとおりです:
「 始めかぎ括弧があり、
[^(] 始め小括弧ではない任意の文字が一文字あり、
.*? 任意の文字がゼロ個以上連続し(ただし、最短マッチ)、
[^)] 終わり小括弧ではない任意の文字が一文字あり、
」 終わりかぎ括弧がある
通常ではない会話(声を出さない会話)を表す正規表現の意味は以下のとおりです:
「 始めかぎ括弧があり、
( 始め小括弧があり、
.*? 任意の文字がゼロ個以上連続し(ただし、最短マッチ)、
) 終わり小括弧があり、
」 終わりかぎ括弧がある
通常の会話(声を出す会話)を表す正規表現が面倒くさいことになった理由は、現在使用しているテキストエディタでは検索条件の優先順位付けができないためです。他のテキストエディタではもう少し簡単になるかもしれません。上述の正規表現も全ての場合で機能するわけでもありません。以下の例では、機能しないのです。
文字列の例:「あ」
通常の会話(声を出す会話)を表す正規表現では、括弧の中身に少なくとも二文字を要求しているため、括弧の中身が一文字の場合は検索条件にマッチせず、色分け表示もされません。これは、仕様上しかたないものとして諦めています。
正規表現の別の例として、ルビを表す文字列も設定しました。
・ルビを表す正規表現:
| たて棒があり、
.+? 任意の文字が一個以上連続し(ただし、最短マッチ)、
《 始め二重山括弧があり、
.*? 任意の文字がゼロ個以上連続し(ただし、最短マッチ)、
》 終わり二重山括弧がある
ただし、画面上ではルビ化されて表示されてしまうため、要素ごとに分けて表示しています。実際の正規表現は一続きです。
上述の設定のお陰で、各種括弧を閉じたときに条件に合っていれば文字列の色が変わるようになり、一目で括弧の対応関係が正しいかがわかるようになりました。また、地の文と会話文とが異なる色で表示されるため、会話のおおよその割合もわかるようになりました。会話が続いている、地の文が続いている、なども文字列の色で判断できるようになったため、推敲の際にも役立っています。
以下、上述の正規表現も含めて、現在設定している正規表現の例です。
(.+?)
[.+?]
〈.+?〉
「(.*?)」
「[^(].*?[^)]」
『.*?』
※ルビを表す正規表現は省略
正規表現は、方言が強い(ツールによって実装に差がある)ため、あるツールではある正規表現がうまく機能しても、別のツールではそうではないということもあります。正規表現を使うためにはある程度の試行錯誤は避けられませんが、これも仕様上しかたないものとして受け入れています。
参考文献:
『詳説 正規表現 第3版』
著:Jeffrey E.F. Friedl
訳:株式会社ロングテール/長尾 高弘
オライリー・ジャパン




