テキストエディタと正規表現

テキストエディタと正規表現

テキストエディタを文系的な使い方しかしない場合でも、正規表現はある程度使えるようになっていた方が良い。検索や置換の効率が格段に向上する。Windowsのファイル名指定などには「*」「?」のワイルドカードが使えるが、もっと多くの書式があって様々なパターンを検索できるようになる。
正規表現には様々なメタキャラクタ(記号文字)を使って非常に多くのパターン(文字列)をマッチ(検索)させることができるが、これら表現を全て覚えなくても、幾つかの基本的な表現を覚えるだけでも効果は相当期待できる。そういう自分も、基本的な表現しか使えないのである。

代表的な表現

睡人亭 - 秀丸エディタの正規表現
秀丸の場合はこのサイトの解説がわかりやすい。

エディタ毎に少しずつ違う所もある。普通はエディタのヘルプを辿ると使える正規表現のリファレンスがある。全て習得してからでないと使えないというものではないので、検索したい内容に合わせてメタキャラクタを覚えれば良いのではないか。

タグ付き正規表現

正規表現は、検索やGREPはもちろん、置換にも使える。正規表現で検索した文字列を別の文字列に置き換えることが可能である。
たとえば、テキストファイルの内容に見出しとして「2018/12/01」形式の日付が多数あるのを、WZ階層付テキストの見出しに変えるため「..2018/12/01」に置き換えたい場合にどうするか。日付は2010とか2008とか様々あるが、全て同じ形式で行頭にある。

検索や置換機能を使わない場合は一つ一つ見つけ出して手作業で置換することになる。数が少ない場合はそれが一番効率が良いが、100も200も、あるいはそれ以上の箇所がある場合は大変な作業になる。
正規表現を使わずに置換するなら「2018/」を「..2018/」に置き換えてやれば良いが、この「2018/」のパターンが行頭にない場合も置き換えられてしまう。また、西暦数字は2018のみではないため2008とか2009とか、全ての西暦数字について何度も置換機能を使わなければならず、数が多いと作業に時間がかかり、見落としの可能性もある。

正規表現検索を使うと、行頭から半角数字が4つ並びその後に「/」がある文字列を検索すると良いので、「^[0-9]{4}/」とすると2018/でも2017/でも、1999/でも全て検索することができる。
さて、検索することはこれでできるが、これを「..2018/」などに置き換える場合はどうするのか。もちろん、「2009/」は「..2009/」に「2012/」は「..2012/」にしなければならない。西暦年毎に置換を繰り返すのでは上の例と同じことになってしまう。 何度もそんな作業をしなくても一度に置換できる方法はあるはずとは思っていたが、実は自分も具体的な方法を今まで知らなかったのだ。

これが一気にできる方法とは、タグ付き正規表現などと呼ばれる正規表現のパターンを用いることである。
正規表現においてパターン文字列を( )で括ることにより一つのまとまりとして扱うことができ、これを「タグ」として記憶することができるようなのである。タグとして記憶した内容は、「\n」(nは1以上の数字)で呼び出すことができる。
どういうことかというと、「(^[0-9]{4})/」の正規表現で検索すると、2018や2009の数字が一まとまりになってタグとして記憶される。これで、置換文字列に「\1」を入れることで、記憶したタグの内容を呼び出すことができる。
「(^[0-9]{4})/」で検索し「\.\.\1/」に置換するように指定すると、行頭にある西暦年を全て一気に、「2018/」は「..2018/」に「2013/」は「..2013/」に置き換えることができるのである。
置換文字列にある「\」は、タグを現すのと同時にメタ文字でもあって、「.」(ピリオド)が正規表現の記号としてではなく文字列としてのピリオドであることを示すための方法である。これにより、行頭から4つの数字が並びその後に「/」がある文字列は、「..」の後に記憶された数字を呼び戻してその後に「/」をつけて、結果的に「2018/」は「..2018/」に「2014/」は「..2014/」に置き換えるという作業が一気に行われるのである。

このタグ付き正規表現は、秀丸ではそう呼ばれているが、WZ EDITORでは「タグ記憶」、サクラエディタでは「番号指定参照」などと呼ばれ、秀丸以外では「$n」(nは1以上の整数)でも同じ結果になる。すなわち「\.\.\1/」は「\.\.$1/」でも良いようなのである。

正規表現を使う場面

作成したテキスト資産が少ないうちは、書いたものが把握できるので検索も必要ないかも知れない。資産は全てWebサイトにアップして検索の仕組みが使えるように管理できているという場合も正規表現による検索はあまり重要ではないかも知れない。
過去に作成したテキストが多かったり、一つのファイルのデータ自体が多量だったり、また全てそういう資産がローカルにしかない場合は、複数ファイルを一気に検索できるGREPとこの正規表現を組み合わせると強力な検索ツールとなる。
正規表現とGREPを使うと、これまで書いたものの中から「正規表現」という用語と「参照」という用語が同じ行内にあるテキストを全て抽出するというようなことが簡単にできる。正規表現はGREPの使い方とも合わせて覚えておくべきものである。