これまで、正規表現で否定マッチはできないものと思いこんでいました。
が、しかし。
実はできました。否定先読みを使えばよいのです。
否定先読みとは、『マッチに成功したらマッチ失敗とせよ』という正規表現です。
はい、意味がわかりませんね。それが普通の感覚です。
さて、早速実例を。
次の正規表現は『??geにマッチするけどhogeは除外する』という意味になります。
(?!hoge)..ge
この正規表現が何を表しているかというと、
- 文字列を先頭から見て、
"hoge"
が続くのならばマッチ失敗とせよ。- 重要!! → 先読みだからマッチ位置は移動しない。次のマッチも先頭から開始される。
- さもなければ、文字列を先頭から見て
"..ge"
にマッチするか検証せよ。
という意味です。
うーむ、いささかトリッキーではあるものの、これは実践でも使えそうですね。
ちなみに、否定戻り読みを使うやり方もあります
..ge(?<!hoge)
この正規表現の意味は
- 文字列を先頭から見て
"..ge"
にマッチするか検証せよ。 - マッチするならば、文字列を最後尾から見て、最後の4文字が
"hoge"
であればマッチ失敗とせよ。
です。
フクロウ本のすゝめ
最初にこの本で先読みを勉強したときは『いったい何の役に立つんだろう…?』という感想以外は出てこなかったものだけど。
実際に使えるようになってくると、先読みって面白いなぁ。
- 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/04/26
- メディア: 大型本
- 購入: 24人 クリック: 754回
- この商品を含むブログ (84件) を見る
あ、この本は正規表現のバイブルと呼ばれる超有名な一冊です。
もしあなたがデベロッパーであり、かつ未だにお持ちでないならば
今から1分以内にアマゾンでポチる事をオススメします。いやマジで。