# 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'\]/
答案 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会为你逃避正则表达式的特殊字符。