SHOEISHA iD

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

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

正規表現の問題集

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

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


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

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

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

 次は、「指定文字列を含まない」という条件を組み合わせた、複数の文字列指定による検索の正規表現です。

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

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

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

 この問題のポイントは、文字列abを含まない、かつ、文字列bcを含まない、という条件です。

 文字aを含まない、かつ、文字bを含まない、かつ、文字列cdを含む行を検索するのであれば、^[^ab]*cd[^ab]*$でもいいのですが、「文字列を含まない」という条件となっているので、否定先読みを使う必要があります。

 答えは、下記となります。

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

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

xyz

 であれば、行頭と文字xの間、文字yと文字zの間、文字zと行末の間、の3箇所の位置にマッチします。

 行頭から行末までの間に、abがなく、bcもなく、cdがある行にマッチする。と考えてもいいですが、行頭にマッチして、その後.*abがない位置にマッチして、.*bcがない位置にマッチして、.*cdがある位置にマッチして、.*$にマッチすると考えてもいいです。

 もしくは、行頭、かつ.*abがない、かつ、.*bcがない、かつ、.*cdがある位置からの.*$にマッチすると考えてもいいでしょう。言いかえると、肯定先読みと否定先読みを組み合わせて、論理演算を行っているということです。

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

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

 肯定先読みと否定先読みは、それぞれ、肯定先読みが存在肯定命題(指定したパターンが存在する)、否定先読みが存在否定命題(指定したパターンが存在しない)と考えると、分かりやすいでしょう。

 例えば正規表現A?B{1,2}は、下記の4通りの文字列にマッチしますが、

B
BB
AB
ABB

 (?=A?B{1,2})は、4通りの少なくとも1つがある位置にマッチし、(?!A?B{1,2})は、4通りのどの1つも存在しない位置にマッチします。

 ちなみに、指定するパターンが同じである、肯定先読みと否定先読みは、余事象であるため、必ず違う真偽値(片方が真で、片方が偽)となります。例えば、(?=.*ab)(?!.*ab)は、片方が真で、もう片方が偽となります。

次のページ
3. 整数をカンマ区切りに置換

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

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

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング