从string创建正则表达式

时间:2010-01-05 08:05:02

标签: ruby regex

有没有办法从字符串/func:\[sync\] displayPTS/创建正则表达式func:[sync] displayPTS

这个问题背后的故事是我有一个serval字符串模式来搜索文本文件,我不想一次又一次地写同样的东西。

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

相反,我希望有一个功能来完成这项工作:

  def filter string
          #build the reg pattern from string
          File.open($f).readlines.reject {|l| not l =~ pattern}
  end
  filter string1
  filter string2

4 个答案:

答案 0 :(得分:24)

s = "func:[sync] displayPTS"
# => "func:[sync] displayPTS"
r = Regexp.new(s)
# => /func:[sync] displayPTS/
r = Regexp.new(Regexp.escape(s))
# => /func:\[sync\]\ displayPTS/

答案 1 :(得分:11)

我喜欢鲍勃的回答,但只是为了节省键盘上的时间:

string = 'func:\[sync] displayPTS'
/#{string}/

答案 2 :(得分:3)

如果字符串只是字符串,您可以将它们组合成一个正则表达式,如下所示:

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

然后:

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

s !~ regexp相当于not s =~ regexp,但更容易阅读。

避免在不关闭文件的情况下使用File.open。该文件将保持打开状态,直到丢弃的文件对象被垃圾收集,这可能足够长,以至于程序将耗尽文件句柄。如果你需要做的不仅仅是读取行,那么:

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

Ruby将在块结束时关闭文件。

您也可以考虑使用find_all和肯定匹配是否比拒绝和否定匹配更容易阅读。读者心灵所经历的负面影响越少,代码越清晰:

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

答案 3 :(得分:0)

如何使用%r{}

my_regex = "func:[sync] displayPTS"
File.open($f).readlines.reject { |l| not l =~ %r{#{my_regex}} }