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

J

joemac

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
}
 
H

Harry Kakueki

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

Does this help?

str =3D "abcdef"
searchstring =3D "cd"
p str =3D~ /#{searchstring}/


Harry
 
I

Intransition

Does this help?

str =3D "abcdef"
searchstring =3D "cd"
p str =3D~ /#{searchstring}/

You may need to escape:

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

Marnen Laibow-Koser

Thomas said:
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,
 
J

Josh Cheek

[Note: parts of this message were removed to make it a legal post.]

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
}
This should work, here is an image showing how to use it:
http://tinypic.com/r/b5pi7m/6

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
 
B

Brian Candler

Josh said:
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
 
J

joemac

Does this help?

str = "abcdef"
searchstring = "cd"
p str =~ /#{searchstring}/

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
 
R

Rob Biedenharn

Does this help?

str = "abcdef"
searchstring = "cd"
p str =~ /#{searchstring}/

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

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

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
 
J

Jean-Julien Fleck

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,

--=20
JJ Fleck
PCSI1 Lyc=E9e Kl=E9ber
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top