weblog of key_amb

主にIT関連の技術メモ

否定先読み・否定戻り読み

Apacheの設定でこれを使う機会が出てきました。
難しいことはしたくなかったのですが、他に手が思い浮かばなかったので仕方ありません。

参考サイト:XREA.COM
先読み (?=regexp) regexpにマッチする文字列の直前にマッチ
否定先読み (?!regexp) regexpにマッチする文字列の直前でない場所にマッチ
戻り読み (?<=regexp) regexpにマッチする文字列の直後にマッチ。regexpは長さがあらかじめ確定しているような正規表現でなくてはならない
否定戻り読み (?<!regexp) regexpにマッチする文字列の直後でない場所にマッチ。regexpは長さがあらかじめ確定しているような正規表現でなくてはならない

教科書通りな説明でわかりにくいです。

参考サイト:正規表現の先読みについて自分なりにまとめてみました。

こちらのページは解説が丁寧で、わかりやすいように思います。

覚えるには、実際に手を動かすのがよいですね。

先読みの例
irb(main):001:0> matcher = /b(?=cd)cde/
=> /b(?=cd)cde/
irb(main):002:0> matcher =~ "abcde"
=> 1

b(?=cd)という正規表現は、「後ろに"cd"が続く"b"」にマッチします。


Apacheの設定では、特定の拡張子のものをApacheに処理させ、それ以外をTomcatに扱わせるために、下記のように設定しました。

ProxyPassMatch ^/(.*(?<!\.jpg|\.png|\.css|\.js|\.html))$ \
ajp://localhost:8009/$1

ここでは、否定戻り読みを用いています。