小技集でよく正規表現による検索や置換を紹介しています。ここでは秀丸エディタの正規表現について簡単に解説します。
正規表現はもともとUnixのgrepという検索ツールで生まれたといわれます。たいへん便利なため今ではさまざまなOSのいろいろなツールに採用されています。(しかし移植毎に少し方言が発生しています。ここの解説は秀丸エディタの正規表現を説明しています。秀丸以外で正規表現を使う場合は注意してください。)
「正規表現」というと何か厳めしい感じがしますが、これは訳語の失敗ですね。原語は「regular expression」、「一般化表現」とか「パターン表記」などと訳すのが適当かと思います。
正規表現は文字列のパターンを一般化して表現する方法です。たとえば年月日の表記は西暦なら
<数字>年<数字>月<数字>日
というパターンになります。文字列処理ではこういったパターンを見つけて検索をかけれれば便利なことが多いはずです。そこで下のような正規表現が登場します。
[0-9]+年[0-9]+月[0-9]+日
「[0-9]」は0から9までの数字という意味です。1でも2でも9でもこの表現にマッチします。
さてその後ろにある「+」ですが、これは直前の文字が1回以上繰り返すことを意味します。「ab+」とやれば「ab」「abb」「abbbbbb…」にマッチします。「[0-9]+」は数字が並んでいるパターンすべてにマッチします。
ということで上の正規表現は「1999年12月31日」でも「2000年1月1日」でもマッチします。
でも数字の部分は繰り返しの回数を1回以上としいますから、「10000000年100月1000日」などというありえないものもマッチします。*1
正規表現は原理は単純、覚えることもほんの少しです。実際に使用する場面では少しパズルのよう感じになり面倒なこともあるでしょうが、これが使えるととんでもなく便利です。ぜひマスターしましょう。
秀丸エディタで正規表現を行うのは簡単です。Ctrl+F や で検索ダイアログボックスを出したら、検索文字に正規表現を記入して、正規表現のチェックボックスにチェックを入れるだけです。
置換を行う場合なら同じように置換ダイアログボックスの正規表現のチェックボックスにチェックを入れてください。
ためしにこの文書を秀丸エディタにコピーして上の正規表現で検索を行ってみてください。
正規表現は以下のルールを組み合わせて作ります。
文字を表すルールについては、すでに「[0-9]」という表現を紹介しましたね。繰り返しを表すルールは「+」という1回以上の繰り返し表現を紹介済みです。文字の位置を表すルールでは「行頭」とか「行末」など文字がある位置を指定することもできます。
これらの基本ルールに追加して下のふたつのルールがあります。
グループ化のルールは基本ルールのバリエーションです。タグ付き置換は正規表現を置換に利用した場合に重要なルールです。たとえば先程の年月日を表す文字列を「12/13/1999」などと変更したい場合に役立ちます。
ということで正規表現はたった5つのルールだけ覚えればよいのです。
正規表現では次の記号を特別な意味であつかいます。すでに紹介した正規表現中にも「[]+-」という記号が特別な意味で使用されていました。こういった記号をメタ文字などといいますが、秀丸の正規表現でのメタ文字は以下の11種類だけです(すべて半角文字です)。
これらの意味は順次説明します。ここではこんな文字は特別な意味で使われるんだと思ってくだされば結構です。
. | 改行を除く任意の1文字 |
[] | 文字クラス |
- | 文字クラス中に登場した場合はコード範囲 |
^ | 行頭(文字クラスの否定) |
$ | 行末 |
* | 0回以上の繰り返し |
+ | 1回以上の繰り返し |
? | 0または1回現われる |
| | パターンの論理和 |
() | パターンをグループ化 |
\ | エスケープ文字 |
ところで、こういった文字そのものを表現したい場合はどうしたらよいのでしょうか?たとえば「+」は1回以上の繰り返しを表しますから「1+1」は正規表現では「11」「111」「111111…」という意味になってしまいます。ここで登場するのがエスケープ文字「\」です(*2)。この「\」は「続く文字の意味はメタ文字ではなくその文字そのものですよ」と示す記号です。
「\+」の「+」は繰り返しを表す「+」ではなく「+」という文字そのものを表すようになります。正規表現で「1+1」は「1\+1」と書かなくてはなりません。さて「\」という文字そのものはどう書いたらよいでしょう。答えは「\\」。これですべての文字が書けるようになりました。
→「文字を表すルール」に続く