[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Searching Stings with Arrays?

Phil Cooperking

12/20/2006 10:07:00 PM

Hi, I've been having a little problem with this. most of my ruby is from
rails and both are shaky.

okay what I've got is a string (which is a browser user agent) and I
would like to search that string with a predefined array of browsers.
I've done this in php so I'm positve an easy solution exists in Ruby

this is what I got
@string = "mozilla/5.0 (macintosh; u; ppc mac os x; en)
applewebkit/418.9.1 (khtml, like gecko) safari/419.3"

array = ["shiira", "msie", "safari", "firefox", "netscape"]

so I'd like to search the string for any matches, it should stop at
safari and bob's sombodys uncle.

this is what I've been trying to do.
array.find {|b| b == @string}.to_s

this does't work I know, but I'm I in the right direction?

--
Posted via http://www.ruby-....

12 Answers

dblack

12/20/2006 10:13:00 PM

0

Martin DeMello

12/20/2006 10:17:00 PM

0

On 12/21/06, Phil Cooperking <phil@basicmind.co.uk> wrote:
>
> this is what I got
> @string = "mozilla/5.0 (macintosh; u; ppc mac os x; en)
> applewebkit/418.9.1 (khtml, like gecko) safari/419.3"
>
> array = ["shiira", "msie", "safari", "firefox", "netscape"]
>
> so I'd like to search the string for any matches, it should stop at
> safari and bob's sombodys uncle.

array.find {|b| @string =~ /#{b}/}

Iterates over each entry of the array, makes a regexp of it (the
/#{b}/ bit) and matches that against the string. (Ideally, you want
@string =~ Regexp.escape(b), but with the strings you have it comes to
the same thing.)

martin

jeffz_2002

12/20/2006 10:22:00 PM

0

You'll probably have 10 (better) answers for this by the time I've
posted, but here's mine:

a = "something is here"
b = [ 'x', 'y', 'g', 'q', 'z' ]
b.find { |c| Regexp.new( c ).match( a ) } => "g"

The regexp.new creates a new regex (surprise) like /c/, and then
searches for it in the string a. If it's not found, match returns nil,
which is false, so find continues. If it's found, match is an object,
which is true, so find exits with that item from the array.

> this is what I've been trying to do.
> array.find {|b| b == @string}.to_s
> this does't work I know, but I'm I in the right direction?

The find is on the right track, but what you're saying is that the
array item must match the full string ... which, based on your problem
description, is incorrect.

jz

William James

12/20/2006 10:27:00 PM

0

dblack@wobblini.net wrote:
> Hi --
>
> On Thu, 21 Dec 2006, Phil Cooperking wrote:
>
> > Hi, I've been having a little problem with this. most of my ruby is from
> > rails and both are shaky.
> >
> > okay what I've got is a string (which is a browser user agent) and I
> > would like to search that string with a predefined array of browsers.
> > I've done this in php so I'm positve an easy solution exists in Ruby
> >
> > this is what I got
> > @string = "mozilla/5.0 (macintosh; u; ppc mac os x; en)
> > applewebkit/418.9.1 (khtml, like gecko) safari/419.3"
> >
> > array = ["shiira", "msie", "safari", "firefox", "netscape"]
> >
> > so I'd like to search the string for any matches, it should stop at
> > safari and bob's sombodys uncle.
> >
> > this is what I've been trying to do.
> > array.find {|b| b == @string}.to_s
> >
> > this does't work I know, but I'm I in the right direction?
>
> You could use:
>
> @string.include?(b)
>
> or, if you want to be more careful about false positives (like, if
> "msie" was a substring in some other browser's string), you could do:
>
> array.find {|b| @string[/#{b}/] }
>
> which anchors to word boundaries.

Are you sure?

array.find{|s| @string[/\b#{s}\b/] }

Tom Werner

12/20/2006 10:30:00 PM

0

Phil Cooperking wrote:
> Hi, I've been having a little problem with this. most of my ruby is from
> rails and both are shaky.
>
> okay what I've got is a string (which is a browser user agent) and I
> would like to search that string with a predefined array of browsers.
> I've done this in php so I'm positve an easy solution exists in Ruby
>
> this is what I got
> @string = "mozilla/5.0 (macintosh; u; ppc mac os x; en)
> applewebkit/418.9.1 (khtml, like gecko) safari/419.3"
>
> array = ["shiira", "msie", "safari", "firefox", "netscape"]
>
> so I'd like to search the string for any matches, it should stop at
> safari and bob's sombodys uncle.
>
> this is what I've been trying to do.
> array.find {|b| b == @string}.to_s
>
> this does't work I know, but I'm I in the right direction?
>
>

This might get you started off on the right path:

m, agent = *@string.match(/(shiira|msie|safari|firefox|netscape)/)
p agent

outputs

safari

If you need further clarification of this code, just let me know.

Tom Werner

William James

12/20/2006 10:39:00 PM

0

William James wrote:
> dblack@wobblini.net wrote:
> > Hi --
> >
> > On Thu, 21 Dec 2006, Phil Cooperking wrote:
> >
> > > Hi, I've been having a little problem with this. most of my ruby is from
> > > rails and both are shaky.
> > >
> > > okay what I've got is a string (which is a browser user agent) and I
> > > would like to search that string with a predefined array of browsers.
> > > I've done this in php so I'm positve an easy solution exists in Ruby
> > >
> > > this is what I got
> > > @string = "mozilla/5.0 (macintosh; u; ppc mac os x; en)
> > > applewebkit/418.9.1 (khtml, like gecko) safari/419.3"
> > >
> > > array = ["shiira", "msie", "safari", "firefox", "netscape"]
> > >
> > > so I'd like to search the string for any matches, it should stop at
> > > safari and bob's sombodys uncle.
> > >
> > > this is what I've been trying to do.
> > > array.find {|b| b == @string}.to_s
> > >
> > > this does't work I know, but I'm I in the right direction?
> >
> > You could use:
> >
> > @string.include?(b)
> >
> > or, if you want to be more careful about false positives (like, if
> > "msie" was a substring in some other browser's string), you could do:
> >
> > array.find {|b| @string[/#{b}/] }
> >
> > which anchors to word boundaries.
>
> Are you sure?
>
> array.find{|s| @string[/\b#{s}\b/] }

We don't need no stinkin' loops:

p @string.split(/\W/) & array

dblack

12/20/2006 10:45:00 PM

0

William James

12/20/2006 10:48:00 PM

0


dbl...@wobblini.net wrote:
> Hi --
>
> On Thu, 21 Dec 2006, William James wrote:
>
> > dblack@wobblini.net wrote:
> >> Hi --
> >>
> >> On Thu, 21 Dec 2006, Phil Cooperking wrote:
> >>
> >>> Hi, I've been having a little problem with this. most of my ruby is from
> >>> rails and both are shaky.
> >>>
> >>> okay what I've got is a string (which is a browser user agent) and I
> >>> would like to search that string with a predefined array of browsers.
> >>> I've done this in php so I'm positve an easy solution exists in Ruby
> >>>
> >>> this is what I got
> >>> @string = "mozilla/5.0 (macintosh; u; ppc mac os x; en)
> >>> applewebkit/418.9.1 (khtml, like gecko) safari/419.3"
> >>>
> >>> array = ["shiira", "msie", "safari", "firefox", "netscape"]
> >>>
> >>> so I'd like to search the string for any matches, it should stop at
> >>> safari and bob's sombodys uncle.
> >>>
> >>> this is what I've been trying to do.
> >>> array.find {|b| b == @string}.to_s
> >>>
> >>> this does't work I know, but I'm I in the right direction?
> >>
> >> You could use:
> >>
> >> @string.include?(b)
> >>
> >> or, if you want to be more careful about false positives (like, if
> >> "msie" was a substring in some other browser's string), you could do:
> >>
> >> array.find {|b| @string[/#{b}/] }
> >>
> >> which anchors to word boundaries.
> >
> > Are you sure?
> >
> > array.find{|s| @string[/\b#{s}\b/] }
>
> Thanks. I had this weird feeling something was wrong when I sent that
> message.... I think the 'b' variable name fooled me :-)

Yeah, that's why I changed it to "s".

dblack

12/21/2006 1:35:00 AM

0

Ross Bamford

12/21/2006 9:00:00 AM

0

On Wed, 20 Dec 2006 22:06:49 -0000, Phil Cooperking <phil@basicmind.co.u=
k> =

wrote:

> Hi, I've been having a little problem with this. most of my ruby is fr=
om
> rails and both are shaky.
>
> okay what I've got is a string (which is a browser user agent) and I
> would like to search that string with a predefined array of browsers.
> I've done this in php so I'm positve an easy solution exists in Ruby
>
> this is what I got
> @string =3D "mozilla/5.0 (macintosh; u; ppc mac os x; en)
> applewebkit/418.9.1 (khtml, like gecko) safari/419.3"
>
> array =3D ["shiira", "msie", "safari", "firefox", "netscape"]
>
> so I'd like to search the string for any matches, it should stop at
> safari and bob's sombodys uncle.
>
> this is what I've been trying to do.
> array.find {|b| b =3D=3D @string}.to_s
>
> this does't work I know, but I'm I in the right direction?
>

You already have your answers it seems, so for completeness I'll just =

mention a recent ruby quiz:

http://rubyquiz.com/qu...

It focused on larger word sets that you're looking at, but it might give=
=

you a different perspective on the problem.

-- =

Ross Bamford - rosco@roscopeco.remove.co.uk