tags:

views:

57

answers:

3

Hi,

Is there any way to create the regex /func:\[sync\] displayPTS/ from string func:[sync] displayPTS?

The story behind this question is that I have serval string pattens to search against in a text file and I don't want to write the same thing again and again.

 File.open($f).readlines.reject {|l| not l =~ /"#{string1}"/}
 File.open($f).readlines.reject {|l| not l =~ /"#{string2}"/}

Instead , I want to have a function to do the job:

  def filter string
          #build the reg pattern from string
          File.open($f).readlines.reject {|l| not l =~ pattern}
  end
  filter string1
  filter string2
+2  A: 
s = "func:[sync] displayPTS"
# => "func:[sync] displayPTS"
r = Regexp.new(s)
# => /func:[sync] displayPTS/
r = Regexp.new(Regexp.escape(s))
# => /func:\[sync\]\ displayPTS/
Bob Aman
A: 

How about using %r{}:

my_regex = "func:[sync] displayPTS"
File.open($f).readlines.reject { |l| not l =~ %r{#{my_regex}} }
Priit
That won't escape the square brackets.
Bob Aman
+2  A: 

If the strings are just strings, you can combine them into one regular expression, like so:

targets = [
  "string1",
  "string2",
].collect do |s|
  Regexp.escape(s)
end.join('|')
targets = Regexp.new(targets)

And then:

lines = File.readlines('/tmp/bar').reject do |line|
  line !~ target
end

s !~ regexp is equivalent to not s =~ regexp, but easier to read.

Avoid using File.open without closing the file. The file will remain open until the discarded file object is garbage collected, which could be long enough that your program will run out of file handles. If you need to do more than just read the lines, then:

File.open(path) do |file|
  # do stuff with file
end

Ruby will close the file at the end of the block.

You might also consider whether using find_all and a positive match would be easier to read than reject and a negative match. The fewer negatives the reader's mind has to go through, the clearer the code:

lines = File.readlines('/tmp/bar').find_all do |line|
  line =~ target
end
Wayne Conrad
+1 for block form of `File.open` and `find_all`
pierr