# Regexp matching in a block of code

**URL:** <https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241>\
**Category:** Ruby\
**Created:** [February 6, 2008, 4:05am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241 "2008-02-06T04:05:48Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![lmcilwain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ac91a4/32.png) [@lmcilwain](https://www.ruby-forum.com/u/lmcilwain)\
**Post date:** [February 6, 2008, 4:05am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241/1 "2008-02-06T04:05:48Z")

</div>

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 = [“removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”]  
competitors = [“[bar.com](http://bar.com)”, “[bar1.com](http://bar1.com)”, “[bar4.com](http://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

---

<div class="post-metadata">

**Author:** ![lmcilwain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ac91a4/32.png) [@lmcilwain](https://www.ruby-forum.com/u/lmcilwain)\
**Post date:** [February 6, 2008, 4:15am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241/2 "2008-02-06T04:15:45Z")

</div>

On Feb 5, 10:00 pm, Vell [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> method each in untitled document at line 5
> 
> ```
> 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 = [“removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”]  
competitors = [“[bar.com](http://bar.com)”, “[bar1.com](http://bar1.com)”, “[bar4.com](http://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

---

<div class="post-metadata">

**Author:** ![lmcilwain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ac91a4/32.png) [@lmcilwain](https://www.ruby-forum.com/u/lmcilwain)\
**Post date:** [February 6, 2008, 6:30am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241/3 "2008-02-06T06:30:54Z")

</div>

Lovell Mcilwain wrote:

> addresses = [“removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”]  
> competitors = [“[bar.com](http://bar.com)”, “[bar1.com](http://bar1.com)”, “[bar4.com](http://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 = “removed\_email\_address@domain.invalid”  
comp = “[bar.com](http://bar.com)”

if add =~ comp  
puts ‘matched’  
else  
puts ‘no match’  
end

---

<div class="post-metadata">

**Author:** ![lmcilwain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ac91a4/32.png) [@lmcilwain](https://www.ruby-forum.com/u/lmcilwain)\
**Post date:** [February 6, 2008, 8:27am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241/4 "2008-02-06T08:27:29Z")

</div>

On 06.02.2008, at 04:04, Vell wrote:

> 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

---

<div class="post-metadata">

**Author:** ![lmcilwain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ac91a4/32.png) [@lmcilwain](https://www.ruby-forum.com/u/lmcilwain)\
**Post date:** [February 6, 2008, 8:35am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241/5 "2008-02-06T08:35:07Z")

</div>

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

> > else
> 
> 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

---

<div class="post-metadata">

**Author:** ![lmcilwain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ac91a4/32.png) [@lmcilwain](https://www.ruby-forum.com/u/lmcilwain)\
**Post date:** [February 6, 2008, 11:06am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241/6 "2008-02-06T11:06:30Z")

</div>

2008/2/6, Vell [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > at top level in untitled document at line 7  
> > Any help again is appreciated.  
> > puts “#{check} matched”  
> > addresses = [“removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”]  
> > 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](http://bar.com)”, “[bar1.com](http://bar1.com)”, “[bar4.com](http://bar4.com)”].to\_set  
addresses = [“removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”]  
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](http://bar.com)”, “[bar1.com](http://bar1.com)”, “[bar4.com](http://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

---

<div class="post-metadata">

**Author:** ![lmcilwain](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ac91a4/32.png) [@lmcilwain](https://www.ruby-forum.com/u/lmcilwain)\
**Post date:** [February 6, 2008, 10:22am UTC](https://www.ruby-forum.com/t/regexp-matching-in-a-block-of-code/128241/7 "2008-02-06T10:22:17Z")

</div>

On Feb 5, 9:00 pm, Vell [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> method each in untitled document at line 5
> 
> ```
> else
> puts "No Match"
> end
> 
> ```
> 
> end  
> end

Trivial.

E:\>irb --prompt xmp  
addresses = [“removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”]  
==\>[“removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”, “removed\_email\_address@domain.invalid”]  
competitors = [“[bar.com](http://bar.com)”, “[bar1.com](http://bar1.com)”, “[bar4.com](http://bar4.com)”]  
==\>[“[bar.com](http://bar.com)”, “[bar1.com](http://bar1.com)”, “[bar4.com](http://bar4.com)”]  
addresses.map{|x| x.split(‘@’).last } & competitors  
==\>[“[bar1.com](http://bar1.com)”]
