その買うを、もっとハッピーに。|ハピタス

正規表現

ちょっと正規表現について書いてみようと思います。


最近まで間違って使用していた事があって、
同じような間違いをしている人もいるかもしれません。


例えば下記のようなhtmlの一部があったとします。


<a href="./index.html"><strong>表示文字列</strong></a>
<a href="./index.html"><img src="./image/1.jpg"></a>


プログラムの場合を前提としてですが、
このような時、画像表示されない方のリンクURLを得たい場合、
今までは「<a href.*html">[^(<img)]」なんて書いてた訳ですが、
これは間違いなんですよね。
「<img」を()でグループ化して、「[^]」で否定して、
「<imgという文字列が無い」になると思ってましたが、
これは間違いのようです。


表現するのが難しいですが、「[^(<img)]」は
「<でもiでもmでもgでも(でも)でもない」となるようです。
従って、今回の場合「<a href.*html">[^(<img)]」では何も一致しません。


ではどう記述すれば良いか?


このように記述すれば画像表示されない方のリンクURLを取得出来ます。
「<a href.*html">(?!<img)」


(?!regexp)とは、括弧内にある正規表現が続かないことを表します。
よって、1から説明すると、
「<a hrefという文字列があって、何でも良い文字が続いて、
html">という文字列があって、それに<imgという文字列が続かない」
となります。(後方不一致)


これで画像表示されてない方のリンクURLに対し一致する事が出来ましたが、
まだタグの状態なので、後は関数使うなりして中のURLを取り出せばOKです。


因みに、
(?!regexp)は後方不一致ですが、
(?=regexp)は後方一致、(?<=pattern)は前方一致
(?<!pattern)は前方不一致となります。


正規表現が扱える、おすすめテキストエディタをご紹介!


Windows:秀丸エディタ
Macintosh:CotEditer


皆さんもがんばって下さい(笑)



詳説 正規表現 第3版

詳説 正規表現 第3版