Basic Werk | Blog | Contact


MEMOMEM

20130621001920_regex_lookbehind_not



例えばあるHTML文書の中に埋め込まれた画像の情報を抜き出したいとします。


画像には jpg, gif, png が複数入り乱れているとしましょう。


この中から「拡張子が gif でない」画像の URL だけ抽出したいとします。

「〜でない」という条件と、それ以外が複数ある場合に便利なのが「否定の先後読み」という正規表現のテクニックです。



この場合、拡張子は URL の最後に付きますので、一旦 URL 全体を正規表現に飲み込ませて、飲み込んだ文字列のケツがどうなってるか後から確認させますので、「否定の後読み」を使います。

また、正規表現には方言や制限がたくさんありますが、最も自由度の高い正規表現エンジンは Perl に組み込まれたものです。


Perl で「拡張子が gif でない」画像の URL だけ抽出する処理をワンライナーで書くと次のようになります。



$ perl -wnl -e 'print $1 if m/<img src="([^"]+(?<!\.gif))"[^>]*>/imsg' file


(?<!\.gif) この部分が否定の後読み (?<!…) になっています。

[^"]+ でダブルクォーテーション内の文字列 = URL を飲み込んだ後、ちょっと後戻りして拡張子が gif でない、つまりそれ以外の jpg や png にマッチするかどうかを確かめています。


マッチすると "([^"]+(?<!\.gif))" のようにダブルクォーテーションの内側が括弧でくくられているので、正規表現エンジンによって組み込み変数である $1 にキャプチャされ、最後に Perl によって print されます。


#Regex #Perl #HTML



SN 2013/06/26 23:20:34

Archives > 20130621001920_regex_lookbehind_not.html