有没有办法从字符串/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
答案 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}} }