正規表現のパターンマッチは,出来る限り多くのモノにマッチするようになっている.最長一致の原則である.
たとえば,
abcdefghijabcdefghijabcdefghij
という文字列について,パターン「c.+g」 に一致するのはこのパターン最長の
cdefghijabcdefghijabcdefg
である.
だもんで,アクセスログの表示はリンク元のURL
http://www.kensaku-saito-no-rei.jp/kiiwaado/くろべえ/a/5/z/9
から「くろべえ」を切り出すとき,スラッシュに挟まったところの文字列を全部拾おうと
$url =~ /kensaku-saito-no-rei\.jp\/kiiwaado\/(.+)\//;
$kiridasi = $1;
とすると,切り出されるのは 「kensaku-saito-no-rei.jp/kiiwaado/」 の後ろの文字列からは拾うが,おしまいはもっとも後ろのスラッシュ「/」の前までの,
$kiridasi = "くろべえ/a/5/z"
となって,余計なものがついてしまう.
これを解決するのが,最短一致のオプション「 ? 」である.
たとえば,
abcdefghijabcdefghijabcdefghij
という文字列について,パターン「c.+?g」 と一致するのはパターン最短の
cdefg
である.
検索語の切り出しは
$url =~ /kensaku-saito-no-rei\.jp\/kiiwaado\/(.+?)\//
$kiridasi = $1;
とするだけで,
$kiridasi = "くろべえ"
だけが切り出される.
アクセスログの検索語の切り出しは,今まで
http://www.google.co.jp/search?hl=ja&q=くろべえ&lr=
といったURL から q= のような部分を探して,= の前の文字 q を指定するだけで「くろべえ」が切り出されるように組んであった.その文字はサイトによって,keyword だったり,query だったり qw だったりいろいろだが,それだけを書き換えればすぐ対応できるようなプログラムだった.
ところが,最近,
http://www.kensaku-saito-no-rei.jp/kiiwaado/検索語/a/5/z/9
のように,そのパターンに当てはまらないサイトが出てきたので,ちょいとプログラムを追加した.
「だもんで・・・」というフレーズは,名古屋の友人を思い出す.
最短一致はよくお世話になります。
返信削除あとは、^と$が便利ですよね。
最近はプログラムしなくなって忘れてました.ネットで調べて,「そうだよ,"?" だよ」と・・・
返信削除昔は sed とか awk とか perl で大量のテキストを一気に処理するのに,ずいぶんと RE を使ったものです.今は RE 対応のテキストエディタでたまに使う程度かな.