読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

正規表現で否定マッチ

Regex

これまで、正規表現で否定マッチはできないものと思いこんでいました。


が、しかし。
実はできました。否定先読みを使えばよいのです。
否定先読みとは、『マッチに成功したらマッチ失敗とせよ』という正規表現です。
はい、意味がわかりませんね。それが普通の感覚です。


さて、早速実例を。
次の正規表現は『??geにマッチするけどhogeは除外する』という意味になります。

(?!hoge)..ge

この正規表現が何を表しているかというと、

  1. 文字列を先頭から見て、 "hoge" が続くのならばマッチ失敗とせよ。
    • 重要!! → 先読みだからマッチ位置は移動しない。次のマッチも先頭から開始される。
  2. さもなければ、文字列を先頭から見て "..ge" にマッチするか検証せよ。


という意味です。
うーむ、いささかトリッキーではあるものの、これは実践でも使えそうですね。


ちなみに、否定戻り読みを使うやり方もあります

..ge(?<!hoge)

この正規表現の意味は

  1. 文字列を先頭から見て "..ge" にマッチするか検証せよ。
  2. マッチするならば、文字列を最後尾から見て、最後の4文字が "hoge" であればマッチ失敗とせよ。

です。

フクロウ本のすゝめ

最初にこの本で先読みを勉強したときは『いったい何の役に立つんだろう…?』という感想以外は出てこなかったものだけど。
実際に使えるようになってくると、先読みって面白いなぁ。

詳説 正規表現 第3版

詳説 正規表現 第3版


あ、この本は正規表現のバイブルと呼ばれる超有名な一冊です。
もしあなたがデベロッパーであり、かつ未だにお持ちでないならば
今から1分以内にアマゾンでポチる事をオススメします。いやマジで。