Создайте регулярное выражение из строки

Есть ли любой способ создать 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
11
задан John Topley 29 March 2015 в 10:47
поделиться

3 ответа

s = "func:[sync] displayPTS"
# => "func:[sync] displayPTS"
r = Regexp.new(s)
# => /func:[sync] displayPTS/
r = Regexp.new(Regexp.escape(s))
# => /func:\[sync\]\ displayPTS/
25
ответ дан 3 December 2019 в 01:20
поделиться

Как насчёт использования %r{}:

my_regex = "func:[sync] displayPTS"
File.open($f).readlines.reject { |l| not l =~ %r{#{my_regex}} }
1
ответ дан 3 December 2019 в 01:20
поделиться

Если строки - это всего лишь строки, то их можно объединить в одно регулярное выражение, например:

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
3
ответ дан 3 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: