肯定先読み・肯定戻り読みの応用
山岸賢治 [著] 2008/11/07 14:00

SourceCode 1.62 KB

 プログラム言語やSQL、テキストエディタで使用可能な「正規表現」を使う際の、考え方と処理のイメージを、具体的な例題を交えて解説します。第2回は肯定先読み・肯定戻り読みを応用したさまざまな表現を紹介します。

1 2 3 4 →

はじめに

 筆者が運営するサイト『正規表現パズル』で扱っている、正規表現の問題とその答えを、EmEditorの正規表現を使って解説していきます。EmEditorの正規表現の文法は、『EmEditor 使い方: 正規表現構文』を参照してください(Perl準拠です)。

対象読者

 『詳説 正規表現 第3版』を教科書として、本稿は問題集という位置づけとなりますので、『詳説 正規表現 第3版』を一読された方。

必要な環境

 EmEditor Professional Version 6.00.4で動作確認しました。その他、プログラム言語やSQLやテキストエディタなどでも応用できます。

1. IPの前ゼロを削除

 最初は、IPの前ゼロを削除する正規表現についてです。

置換条件
IPアドレスの前ゼロを削除する。

 対象データと期待する置換結果は、下記となります。

置換前
置換前
置換後
置換後

 前ゼロを削除する処理は、

  1. 数字を左から見る。0でかつ次の桁が存在したら、その0を削除する。
  2. また数字を左から見る。0でかつ次の桁が存在したら、その0を削除する。
  3. また数字を左から見る。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にマッチする正規表現になっています。

 正規表現のイメージは下記となります。

正規表現のイメージ
正規表現のイメージ

1 2 3 4
→
INDEX
正規表現の問題集2(応用編)
Page1
はじめに
対象読者
必要な環境
1. IPの前ゼロを削除
2. カンマ区切りの金額を検索
3. 否定先読みで条件チェック
4. 指定文字列内の、指定文字を検索
最後に
参考資料
プロフィール
山岸賢治 ヤマギシケンジ

Oracle ACEの1人。
OracleSQLパズルの運営者。
ORACLE MASTER Silver Oracle Database 10g
(研修受講で)ORACLE MASTER Gold Oracle Database 10g
ソフトウェア開発技術者 (情報処理技術者試験)
第二種情報処理技術者 (情報処理技術者試験)
 


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト