Using eval() to create a Regexp object from a string

Hi,

I'm trying to create a Regexp object by calling eval like this:

def eval_to_regexp(o)
  if o.is_a?(Regexp)
    o
  elsif o.is_a?(String)
    o = o[5..o.size] if o[0..4] == 'eval:'
    eval("/#{o}/")
  else
    eval("/#{o.to_s}/")
  end
end

e = eval_to_regexp("eval:some_function() + '^'")

Suppose some_function() returns the string '/home/test'

And then I use it to test a match as follows:

'/home/test' =~ e # should return 0
'/home/test/somethingelse' =~ e # should return nil (because of the '^'
above)

I also tried using /#{o}/ directly instead of the eval, but it doesn't
work either :frowning:

Thanks in advance!

- Ivan V.

···

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

Ivan V. wrote:

I'm trying to create a Regexp object by calling eval like this:

I'm sorry, but why don't you just do regexp=Regexp.new(your_string) ?

···

--
NP: Anathema - Pressure
Ist so, weil ist so
Bleibt so, weil war so

Hi --

···

On Thu, 5 Jul 2007, Ivan V. wrote:

Hi,

I'm trying to create a Regexp object by calling eval like this:

def eval_to_regexp(o)
if o.is_a?(Regexp)
   o
elsif o.is_a?(String)
   o = o[5..o.size] if o[0..4] == 'eval:'
   eval("/#{o}/")
else
   eval("/#{o.to_s}/")
end
end

e = eval_to_regexp("eval:some_function() + '^'")

Suppose some_function() returns the string '/home/test'

And then I use it to test a match as follows:

'/home/test' =~ e # should return 0
'/home/test/somethingelse' =~ e # should return nil (because of the '^'
above)

I also tried using /#{o}/ directly instead of the eval, but it doesn't
work either :frowning:

I think you might have better luck with Regexp.new:

   e = Regexp.new("^#{some_function}")

or something like that.

David

--
* Books:
   RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242\)
   RUBY FOR RAILS (http://www.manning.com/black\)
* Ruby/Rails training
     & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

I see you already have your answer, but another thing you may want to be aware of is Regexp.escape():

def some_function; '/home/test' end

re = /#{Regexp.escape(some_function)}/ # => /\/home\/test/
re.source # => "/home/test"

James Edward Gray II

···

On Jul 4, 2007, at 10:51 AM, Ivan V. wrote:

Suppose some_function() returns the string '/home/test'

Sebastian Hungerecker wrote:

Ivan V. wrote:

I'm trying to create a Regexp object by calling eval like this:

I'm sorry, but why don't you just do regexp=Regexp.new(your_string) ?

Because I didn't thought about that and I'm a complete newb regarding
Ruby and Regexp (in general), as pointed out by David's correction (the
'^' is for the start of the string, not the end - thanks!).

Thanks a lot :slight_smile:

- Ivan V.

···

--
Posted via http://www.ruby-forum.com/\.

>> I'm trying to create a Regexp object by calling eval like this:
>
> I'm sorry, but why don't you just do regexp=Regexp.new(your_string) ?

Because I didn't thought about that and I'm a complete newb regarding
Ruby and Regexp (in general), as pointed out by David's correction (the
'^' is for the start of the string, not the end - thanks!).

Be careful about eval()! I definitely enjoy eval() but you need to
have some perspective. It's not for newbs.

···

--
Giles Bowkett

Blog: http://gilesbowkett.blogspot.com
Portfolio: http://www.gilesgoatboy.org