[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Regexp matching in a block of code

Lovell Mcilwain

2/6/2008 3:00:00 AM

I am trying to create a script that will allow me to compare email
addresses with a list of domains to see if they match. If they don't
match then everything is good to go, but if they do match, I want to
be able to delete them or move them out of the list.

The code that I wrote gives the following when its ran:
TypeError: type mismatch: String given

method =~ in untitled document at line 7
at top level in untitled document at line 7
method each in untitled document at line 5
at top level in untitled document at line 5
method each in untitled document at line 4
at top level in untitled document at line 4
Program exited.

I know my issue is with this particular line: if(add =~
Regexp.escape(comp))
But I am not sure where to find out or how to resolve it

Any help again is appreciated.

Code:

addresses = ["foo1@bar1.com", "foo2@bar2.com", "foo3@bar3.com"]
competitors = ["bar.com", "bar1.com", "bar4.com"]

addresses.each do |add|
competitors.each do |comp|
puts "Checking Competitor: #{comp}"
if(add =~ Regexp.escape(comp))
puts "#{check} matched"
else
puts "No Match"
end
end
end
6 Answers

Lovell Mcilwain

2/6/2008 3:11:00 AM

0

On Feb 5, 10:00 pm, Vell <lovell.mcilw...@gmail.com> wrote:
> I am trying to create a script that will allow me to compare email
> addresses with a list of domains to see if they match.  If they don't
> match then everything is good to go, but if they do match, I want to
> be able to delete them or move them out of the list.
>
> The code that I wrote gives the following when its ran:
> TypeError: type mismatch: String given
>
> method =~       in untitled document at line 7
> at top level    in untitled document at line 7
> method each     in untitled document at line 5
> at top level    in untitled document at line 5
> method each     in untitled document at line 4
> at top level    in untitled document at line 4
> Program exited.
>
> I know my issue is with this particular line: if(add =~
> Regexp.escape(comp))
> But I am not sure where to find out or how to resolve it
>
> Any help again is appreciated.
>
> Code:
>
> addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
> competitors = ["bar.com", "bar1.com", "bar4.com"]
>
> addresses.each do |add|
>   competitors.each do |comp|
>     puts "Checking Competitor: #{comp}"
>     if(add =~ Regexp.escape(comp))
>       puts "#{check} matched"
>     else
>       puts "No Match"
>     end
>   end
> end

Sorry guys, Messed up on initial insert of the code. Here is the code
as follows:

Code:
addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
competitors = ["bar.com", "bar1.com", "bar4.com"]
addresses.each do |add|
competitors.each do |comp|
puts "Checking Competitor: #{comp}"
if(add =~ Regexp.escape(comp))
puts "matched"
else
puts "No Match"
end
end
end

7stud --

2/6/2008 5:31:00 AM

0

Lovell Mcilwain wrote:
> addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
> competitors = ["bar.com", "bar1.com", "bar4.com"]
> addresses.each do |add|
> competitors.each do |comp|
> puts "Checking Competitor: #{comp}"
> if(add =~ Regexp.escape(comp))
> puts "matched"
> else
> puts "No Match"
> end
> end
> end

Try this:

add = "f@bar.com"
comp = "bar.com"

if add =~ comp
puts 'matched'
else
puts 'no match'
end

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

Karl-Heinz Wild

2/6/2008 7:27:00 AM

0


On 06.02.2008, at 04:04, Vell wrote:

> addresses = ["foo1@bar1.com", "foo2@bar2.com", "foo3@bar3.com"]
> competitors = ["bar.com", "bar1.com", "bar4.com"]
>
> addresses.each do |add|
> competitors.each do |comp|
> puts "Checking Competitor: #{comp}"
> if(add =~ Regexp.escape(comp))
> puts "#{check} matched"
> else
> puts "No Match"
> end
> end
> end


As you can see in the documentation Regexp.escape returns a string
and Regexp.new returns an regexp.

If you write

if(add =~ %r { Regexp.escape(comp)) }

or

if(add =~ Regexp.new( Regexp.escape(comp)) )

you code works for me.

- Karl-Heinz





Karl-Heinz Wild

2/6/2008 7:34:00 AM

0

On 06.02.2008, at 08:26, Karl-Heinz Wild wrote:

> On 06.02.2008, at 04:04, Vell wrote:
>
>> addresses = ["foo1@bar1.com", "foo2@bar2.com", "foo3@bar3.com"]
>> competitors = ["bar.com", "bar1.com", "bar4.com"]
>>
>> addresses.each do |add|
>> competitors.each do |comp|
>> puts "Checking Competitor: #{comp}"
>> if(add =~ Regexp.escape(comp))
>> puts "#{check} matched"
>> else
>> puts "No Match"
>> end
>> end
>> end
>
>
> As you can see in the documentation Regexp.escape returns a string
> and Regexp.new returns an regexp.
>
> If you write
>
> if(add =~ %r { Regexp.escape(comp)) }
>
> or
>
> if(add =~ Regexp.new( Regexp.escape(comp)) )
>
> you code works for me.

You can also write

if Regexp.new( comp ).match( add )
...

- Karl-Heinz


William James

2/6/2008 9:16:00 AM

0

On Feb 5, 9:00 pm, Vell <lovell.mcilw...@gmail.com> wrote:
> I am trying to create a script that will allow me to compare email
> addresses with a list of domains to see if they match. If they don't
> match then everything is good to go, but if they do match, I want to
> be able to delete them or move them out of the list.
>
> The code that I wrote gives the following when its ran:
> TypeError: type mismatch: String given
>
> method =~ in untitled document at line 7
> at top level in untitled document at line 7
> method each in untitled document at line 5
> at top level in untitled document at line 5
> method each in untitled document at line 4
> at top level in untitled document at line 4
> Program exited.
>
> I know my issue is with this particular line: if(add =~
> Regexp.escape(comp))
> But I am not sure where to find out or how to resolve it
>
> Any help again is appreciated.
>
> Code:
>
> addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
> competitors = ["bar.com", "bar1.com", "bar4.com"]
>
> addresses.each do |add|
> competitors.each do |comp|
> puts "Checking Competitor: #{comp}"
> if(add =~ Regexp.escape(comp))
> puts "#{check} matched"
> else
> puts "No Match"
> end
> end
> end

Trivial.

E:\>irb --prompt xmp
addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
==>["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
competitors = ["bar.com", "bar1.com", "bar4.com"]
==>["bar.com", "bar1.com", "bar4.com"]
addresses.map{|x| x.split('@').last } & competitors
==>["bar1.com"]

Robert Klemme

2/6/2008 10:06:00 AM

0

2008/2/6, Vell <lovell.mcilwain@gmail.com>:
> On Feb 5, 10:00 pm, Vell <lovell.mcilw...@gmail.com> wrote:
> > I am trying to create a script that will allow me to compare email
> > addresses with a list of domains to see if they match. If they don't
> > match then everything is good to go, but if they do match, I want to
> > be able to delete them or move them out of the list.
> >
> > The code that I wrote gives the following when its ran:
> > TypeError: type mismatch: String given
> >
> > method =~ in untitled document at line 7
> > at top level in untitled document at line 7
> > method each in untitled document at line 5
> > at top level in untitled document at line 5
> > method each in untitled document at line 4
> > at top level in untitled document at line 4
> > Program exited.
> >
> > I know my issue is with this particular line: if(add =~
> > Regexp.escape(comp))
> > But I am not sure where to find out or how to resolve it
> >
> > Any help again is appreciated.
> >
> > Code:
> >
> > addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
> > competitors = ["bar.com", "bar1.com", "bar4.com"]
> >
> > addresses.each do |add|
> > competitors.each do |comp|
> > puts "Checking Competitor: #{comp}"
> > if(add =~ Regexp.escape(comp))
> > puts "#{check} matched"
> > else
> > puts "No Match"
> > end
> > end
> > end
>
> Sorry guys, Messed up on initial insert of the code. Here is the code
> as follows:
>
> Code:
> addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
> competitors = ["bar.com", "bar1.com", "bar4.com"]
> addresses.each do |add|
> competitors.each do |comp|
> puts "Checking Competitor: #{comp}"
> if(add =~ Regexp.escape(comp))
> puts "matched"
> else
> puts "No Match"
> end
> end
> end

There are a few things to say about this approach. First, it seems no
regular expression is needed here - at least not for matching.
Second, using Set is significantly more efficient. Here's one way to
do it:

competitors = ["bar.com", "bar1.com", "bar4.com"].to_set
addresses = ["f...@bar1.com", "f...@bar2.com", "f...@bar3.com"]
dirty, clean = addresses.partition {|adr| competitors.include?
adr[/@(\S+)/, 1].downcase}

Now, if you are reading a large number of addresses from a file, you could do

competitors = ["bar.com", "bar1.com", "bar4.com"].to_set
dirty = []
clean = []

File.foreach "adresses.txt" do |line|
adr = line[/\S+@\S+/] # this should be improved
(competitors.include? adr[/@(\S+)/, 1].downcase ?
dirty : clean) << adr
end

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end