はじめに
筆者が運営するサイト『正規表現パズル』で扱っている、正規表現の問題とその答えを、EmEditorの正規表現を使って解説していきます。EmEditorの正規表現の文法は、『EmEditor 使い方: 正規表現構文』を参照してください(Perl準拠です)。
対象読者
『詳説 正規表現 第3版』を教科書として、本稿は問題集という位置づけとなりますので、『詳説 正規表現 第3版』を一読された方。
必要な環境
EmEditor Professional Version 6.00.4で動作確認しました。その他、プログラム言語やSQLやテキストエディタなどでも応用できます。
1. IPの前ゼロを削除
最初は、IPの前ゼロを削除する正規表現についてです。
IPアドレスの前ゼロを削除する。
対象データと期待する置換結果は、下記となります。
前ゼロを削除する処理は、
- 数字を左から見る。0でかつ次の桁が存在したら、その0を削除する。
- また数字を左から見る。0でかつ次の桁が存在したら、その0を削除する。
- また数字を左から見る。0でかつ次の桁が存在したら、その0を削除する。
という処理を繰り返しますが、これを正規表現でどう実現するかが、この問題の難しいところです。答えは、下記です。
(^|(?<=\.))0+(?=[0-9]) を削除
上記の正規表現を解説すると、まず(^|(?<=\.))
でマッチの開始位置を、(行頭またはピリオド)の次の文字からとしてます。ピリオドは円マークでエスケープしないと、任意の1文字を意味する正規表現と解釈されますので、気をつけて下さい。
続いて0+
を指定して0にできるだけマッチさせ、肯定先読みの(?=[0-9])
を指定して、0+
によって0にマッチしすぎた場合に対処してます。
たとえば、000.000.025.205
を(^|(?<=\.))0+
で検索すると下記の検索結果となります。
また、000.000.025.205
を(^|(?<=\.))0+(?=[0-9])
で検索すると下記の検索結果となります。
以上により、0+(?=[0-9])
は、0にマッチできるだけマッチするが、最後のマッチ文字が0だったら、バックトラックが発生し最後の0にはマッチしないと分かります。これは、削除すべき0にマッチする正規表現になっています。
正規表現のイメージは下記となります。