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.

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) ?

Hi –

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

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

Sebastian H. 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.

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

Suppose some_function() returns the string ‘/home/test’

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 G. II

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 B.

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