SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

正規表現の問題集

正規表現の問題集2(応用編)

肯定先読み・肯定戻り読みの応用

  • このエントリーをはてなブックマークに追加

ダウンロード SourceCode (1.6 KB)

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

  • このエントリーをはてなブックマークに追加

はじめに

 筆者が運営するサイト『正規表現パズル』で扱っている、正規表現の問題とその答えを、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にマッチする正規表現になっています。

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

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

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
2. カンマ区切りの金額を検索

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
正規表現の問題集連載記事一覧
この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2676 2008/11/07 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング