logo       

[ruby-list:42458] Re: 多量の正規表現との効率的なマッチのアイデアを、、: msg#00112

lang.ruby.japanese

Subject: [ruby-list:42458] Re: 多量の正規表現との効率的なマッチのアイデアを、、

From: しん <dezawa-eY1vtc/6GtbR7s880joybQ@xxxxxxxxxxxxxxxx>
Subject: [ruby-list:42456] Re: 多量の正規表現との効率的なマッチのアイデアを、、
Date: Fri, 23 Jun 2006 10:05:50 +0900

> こういうデータで
> 52 convctr.overture.com
> 52 ct1.shinobi.jp
> 52 download.jword.jp
> 52 download.windowsupdate.com
> 52 officescan-p.activeupdate.trendmicro.com:80
> 49 w3b.mydomain.co.jp
> 49 www.example.com

> 何もしなければこういう結果を出す。
> 52 5count
> 49 2count
納得。

> そこで、たとえばこういう情報を追加して
> mycat=[ "m0" , "m0" ,"m1"   ,"m2" ]
> myreg=[ /windowsupdate/, /trendmicro/,/w3b\.mydomain/,/mydomain/ ]
>
> こういう結果にする。
> 52 3count

52に分類されているドメインのうちmyregのどれかに一致するのはこの2つでは?
52 download.windowsupdate.com
52 officescan-p.activeupdate.trendmicro.com:80

> ついでに、、、
> m0 windowsupdate
> m0 trendmicro
> m1 w3b.mydomain
> m2 mydomain
>
> という入力データから正規表現のかたまりを作るには、
> while gets でくくってこつこつ、
> f=stlip して myreg << Reg.new(f[1]).gsub(/\./,"\\./).gsub(/\//,"\\/")
> するしか無いですか?

stlip? Reg?

正規表現のquoteなら.gsub(/\./,"\\./).gsub(/\//,"\\/")の部分はRegexp.quoteが使えますね。

Rubyらしさを求めるならば、ぜひブロックを使いましょう。
each、map、find_allあたりから慣れてみましょう。
各々の要素について処理を行ない新たな配列を返すmapはとても便利です!!

input.split(/\n/).map{|line| cat,data = line.split; [cat,
Regexp.new(Regexp.quote(data))]}
# => [["m0", /windowsupdate/], ["m0", /trendmicro/], ["m1", /w3b\.mydomain/],
["m2", /mydomain/]]

> 正規表現を値にする配列を作り、レコードを読むたびに配列の中を順に
> マッチさせて行けば良いのでしょうが、なんかおもしろくないな、、
> ということで、
> 効率的に行なう方法
>
> rubyらしい、きれいな方法か
>
> がないものか悩んでいるところです。

こういう質問をする場合は悩む前にとりあえず動くプログラムを書いてください。
どういう形であれ動くプログラムがあれば意図は伝わります。

--
rubikitch
http://www.rubyist.net/~rubikitch/




<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise