使用正则表达式从文件中提取env变量

时间:2016-08-01 20:18:09

标签: ruby-on-rails ruby regex variables logic

# code

ENV['VAR_1'] = 'HELLO 1'
ENV['VAR_2'] = 'HELLO 2'
ENV['VAR_3'] = 'HELLO 3'

# code

如何使用ruby和regex提取每个变量及其值?

目前我正在逐行进行,这是愚蠢的。

S3_SECRET       = line.split(' = ').last.delete("'") if line =~ /ENV\['S3_SECRET'\]/
S3_KEY          = line.split(' = ').last.delete("'") if line =~ /ENV\['S3_KEY'\]/
S3_BUCKET       = line.split(' = ').last.delete("'") if line =~ /ENV\['S3_BUCKET'\]/

2 个答案:

答案 0 :(得分:2)

你可能有一个非常详细的正则表达式,如

/^ENV\['(.*?)'\] *= *'(.*?)'$/

请参阅regex demo

<强>详情:

  • ^ - 行首
  • ENV\[' - 文字ENV['子字符串
  • (.*?) - 第1组捕获除了换行符之外的0 +字符,直到第一个字符为止
  • '\] - 文字']文字
  • *= * - 带有可选(0个或更多)空格的=符号
  • ' - 单引号
  • (.*?) - 第2组尽可能少地删除除换行之外的0 +字符
  • ' - 最终' at ...
  • $ - 该行的结尾。

这是Ruby demo

s = <<DATA
# code

ENV['VAR_1'] = 'HELLO 1'
ENV['VAR_2'] = 'HELLO 2'
ENV['VAR_3'] = 'HELLO 3'

# code
DATA
puts s.scan(/^ENV\['(.*?)'\] *= *'(.*?)'$/).to_h

输出:{"VAR_1"=>"HELLO 1", "VAR_2"=>"HELLO 2", "VAR_3"=>"HELLO 3"}

答案 1 :(得分:1)

假设您已将文件读入行数组(例如,使用IO#readlines)。

arr = ["ENV['VAR_1'] = 'HELLO 1'",
       "ENV['VAR_2'] = 'HELLO 2'",
       "ENV['VAR_3'] = 'HELLO 3'"]

我们不是直接使用复杂的正则表达式,而是删除我们不想要的文本,split "="上的缩小字符串,用空格包围,然后转换结果数组哈希。

bad_bits = %w| ENV[ ] ' |
  #=> ["ENV[", "]", "'"] 
r = Regexp.union(bad_bits)
  #=> /ENV\[|\]|'/ 
arr.map { |str| str.gsub(r, '') }.map { |s| s.split(/\s+=\s+/) }.to_h
  #=> {"VAR_1"=>"HELLO 1", "VAR_2"=>"HELLO 2", "VAR_3"=>"HELLO 3"} 

请注意,Regexp::union会为你逃避正则表达式的特殊字符。