Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interpolating a string into a regex

Tags:

regex

ruby

Same as string insertion.

if goo =~ /#{Regexp.quote(foo)}/
#...

Note that the Regexp.quote in Jon L.'s answer is important!

if goo =~ /#{Regexp.quote(foo)}/

If you just do the "obvious" version:

if goo =~ /#{foo}/

then the periods in your match text are treated as regexp wildcards, and "0.0.0.0" will match "0a0b0c0".

Note also that if you really just want to check for a substring match, you can simply do

if goo.include?(foo)

which doesn't require an additional quoting or worrying about special characters.


Probably Regexp.escape(foo) would be a starting point, but is there a good reason you can't use the more conventional expression-interpolation: "my stuff #{mysubstitutionvariable}"?

Also, you can just use !goo.match(foo).nil? with a literal string.


Regexp.compile(Regexp.escape(foo))

Use Regexp.new:

if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/

Here's a limited but useful other answer:

I discovered I that I can easily insert into a regex without using Regexp.quote or Regexp.escape if I just used single quotes on my input string: (an IP address match)

IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key 
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0") 
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"

single quotes only interpret \\ and \'.

http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes

This helped me when i needed to use the same long portion of a regex several times. Not universal, but fits the question example, I believe.