Давайте сначала создадим файл.
FNAME = 't'
File.write(FNAME, <<~END
cat
[Test]
key1 = value
key2 = value2
[Test2]
key1 = value3
key3 = value4 value5
dog
END
)
#=> 90
Для извлечения интересующих значений можно использовать следующий метод.
def extract(section, key)
rkey_match = /\A *#{key} *= /
rkey_get = /\A *#{key} *= *\K.*/
section_found = false
File.foreach(FNAME, chomp:true) do |line|
if line.strip == section
section_found = true
elsif section_found
return line[rkey_get] if line.match?(rkey_match)
end
end
nil
end
extract('[Test]', 'key1')
#=> "value"
extract('[Test2]', 'key3')
#=> "value4 value5"
extract('[Test]', 'key7')
#=> nil
extract('[Test3]', 'key1')
#=> nil
Для
section = "[Test2]"
key = "key3"
регулярное выражение вычисляется следующим образом.
rkey_match = /\A *#{key} *= /
#=> /\A *cat *= /
rkey_get = /\A *#{key} *= *\K.*/
#=> /\A *cat *= *\K.*/
В rkey_get
, \K
в общих чертах означает забыть все, что было найдено до сих пор.
В зависимости от требований могут потребоваться некоторые настройки в построении регулярного выражения.