How do I use a variable in a regexp search string?

Hi All,

I dont know how to use a variable in a regex searchstring.
ruby seems to only handle hardcoded serachstring in
regex’s. How do you do this. My code is below.

Also - how do you put a variable name in a
File.open(“filename.txt”) statement like this:
File.open(filevariable) where filevariable can
be set to anything? I could not find this in
the docs.

Thanks, --Joe
================ snip code ===============
#!/usr/bin/ruby

F = “filename.txt”
searchstring = ARGV[0]

print "searchstring is ", searchstring, “\n”

File.open(“filename.txt”).each { |line|

this fails puts line if line =~ searchstring

this fails puts line if line =~ /searchstring/

this fails puts line if line =~ “searchstring”

#this works

puts line

}

I dont know how to use a variable in a regex searchstring.
ruby seems to only handle hardcoded serachstring in
regex’s. How do you do this. My code is below.

Does this help?

str = “abcdef”
searchstring = “cd”
p str =~ /#{searchstring}/

Harry

On Jan 29, 10:38 pm, Harry K. [email protected] wrote:

I dont know how to use a variable in a regex searchstring.
ruby seems to only handle hardcoded serachstring in
regex’s. How do you do this. My code is below.

Does this help?

str = “abcdef”
searchstring = “cd”
p str =~ /#{searchstring}/

You may need to escape:

p str =~ /#{Regexp.escape(searchstring)}/

Thomas S. wrote:

On Jan 29, 10:38�pm, Harry K. [email protected] wrote:

I dont know how to use a variable in a regex searchstring.
ruby seems to only handle hardcoded serachstring in
regex’s. � How do you do this. � My code is below.

Does this help?

str = “abcdef”
searchstring = “cd”
p str =~ /#{searchstring}/

You may need to escape:

p str =~ /#{Regexp.escape(searchstring)}/

But note that #{} only makes sense if you’re interpolating a variable
into part of a regex – say, /January #{year}/. If the variable is the
whole regex, then it’s more sensible to do Regex.new(searchstring).

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

On Fri, Jan 29, 2010 at 6:50 PM, joemac [email protected]
wrote:

the docs.

File.open(“filename.txt”).each { |line|

this fails puts line if line =~ searchstring

this fails puts line if line =~ /searchstring/

this fails puts line if line =~ “searchstring”

#this works

puts line

}

This should work, here is an image showing how to use it:

filename = ‘source.txt’
to_find = Regexp.new ARGV[0]

puts “The Regexp is: #{to_find.inspect}”

File.open(filename).each do |line|
if line =~ to_find
puts “This line matches: #{line}”
puts “This is what matches: #{line[to_find]}”
end
end

On Jan 29, 7:38 pm, Harry K. [email protected] wrote:

Harry
Hi Folks,

Thanks for all the helpful info.
It was the #{} syntax that i was missing.
This also works for the “filename as a varible” situation
when parsing lots of files:

filenames = [“input1”, “input2”, “input3”]

for fname in filenames
infile = File.open(“#{fname}”)
while line = infile.gets()
puts line
end
puts “================== end file ===================”
end

Very helpfull!

Thanks, --JM

Josh C. wrote:

File.open(filename).each do |line|
if line =~ to_find
puts “This line matches: #{line}”
puts “This is what matches: #{line[to_find]}”

or to avoid having to match it twice:

puts “This is what matches: #{$&}”

Also:
puts “This is what came before: #{$`}”
puts “This is what came after: #{$’}”
puts “Capture 1 is #{$1}”

etc

On Feb 22, 2010, at 1:45 PM, joemac wrote:

Thanks, --JM

In this case, you’re already getting strings in fname so “#{fname}”
isn’t really doing anything useful.

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

In this case, you’re already getting strings in fname so “#{fname}” isn’t
really doing anything useful.

Which means File.open(fname) would work directly.

Cheers,