Есть ли любой способ создать regex /func:\[sync\] displayPTS/
от строки func:[sync] displayPTS
?
История этого вопроса - то, что у меня есть строковые башмаки сервала для поиска против в текстовом файле, и я не хочу писать то же самое снова и снова.
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
s = "func:[sync] displayPTS"
# => "func:[sync] displayPTS"
r = Regexp.new(s)
# => /func:[sync] displayPTS/
r = Regexp.new(Regexp.escape(s))
# => /func:\[sync\]\ displayPTS/
Как насчёт использования %r{}
:
my_regex = "func:[sync] displayPTS"
File.open($f).readlines.reject { |l| not l =~ %r{#{my_regex}} }
Если строки - это всего лишь строки, то их можно объединить в одно регулярное выражение, например:
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
эквивалентно не 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