SHOEISHA iD

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

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

正規表現の問題集

正規表現の問題集1(基本編)

肯定先読み・肯定戻り読み


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

ダウンロード ソースコード (2.0 KB)

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

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

はじめに

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

対象読者

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

必要な環境

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

1. 複数の指定文字列を含む行の検索

 まずは、複数の指定文字列を含む行を検索する正規表現についてです。

検索条件
文字列abを含んで、かつ、
文字列bcを含んで、かつ、
文字列cdを含む行を検索する。

 対象データと期待する検索結果は、下記となります(黄緑色が検索にヒットした部分です)。

対象データと期待する検索結果
対象データと期待する検索結果

 単純に個々の条件を組み合わせると、3の階乗である3*2=6通りの順列に対応する正規表現をつないだ、次のようなパターンが考えられます。

(エディタには1行で入力してください)
^.*ab.*bc.*cd.*$|
^.*ab.*cd.*bc.*$|
^.*bc.*ab.*cd.*$|
^.*bc.*cd.*ab.*$|
^.*cd.*ab.*bc.*$|
^.*cd.*bc.*ab.*$

 しかし、このパターンは5行目にはマッチしますが、1行目と7行目にマッチしないので、間違いです。文字列abと文字列bcに、bという共通文字があるのが、この問題のポイントです。

 答えは、肯定先読みを使用して下記となります。

答え
^(?=.*ab)(?=.*bc)(?=.*cd).*$

 肯定先読みは、指定したパターンが先に存在する位置にマッチします。たとえば、(?=yz)は次にyzがある位置にマッチしますので、検索対象が

xyz

 であれば、文字xと文字yの間の位置にマッチします。

 ^(?=.*ab)(?=.*bc)(?=.*cd).*$のように、肯定先読みを連続して使っている場合は、行頭にマッチして、その後.*abがある位置にマッチして、その後.*bcがある位置にマッチして、その後.*cdがある位置にマッチして、その後.*$にマッチすると考えてもいいですが、行頭、かつ.*abがある、かつ.*bcがある、かつ.*cdがある位置からの.*$にマッチすると考えた方が分かりやすいでしょう。言いかえると、肯定先読みを連続して使うとそれらの論理積が真となる位置にマッチするということです。

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

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

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

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

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

メールバックナンバー

次のページ
2. 複数の指定文字列を含まない行の検索

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

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

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1573 2008/10/23 13:34

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング