2008年8月19日火曜日

最短一致

正規表現のパターンマッチは,出来る限り多くのモノにマッチするようになっている.最長一致の原則である.
たとえば,
 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
のように,そのパターンに当てはまらないサイトが出てきたので,ちょいとプログラムを追加した.

「だもんで・・・」というフレーズは,名古屋の友人を思い出す.

2 件のコメント:

  1. 最短一致はよくお世話になります。
    あとは、^と$が便利ですよね。

    返信削除
  2. 最近はプログラムしなくなって忘れてました.ネットで調べて,「そうだよ,"?" だよ」と・・・

    昔は sed とか awk とか perl で大量のテキストを一気に処理するのに,ずいぶんと RE を使ったものです.今は RE 対応のテキストエディタでたまに使う程度かな.

    返信削除

「コメントの記入者:」は「匿名」ではなく,「名前/URL」を選んで,なにかニックネームを入れてください.URL は空欄で構いません.