2016-08-01 94 views
3
# code 

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

# code 

如何提取使用紅寶石和正則表達式每個變量和它的值?使用正則表達式從文件中提取env變量

目前我正在一行一行的蠢事。

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

你可能有相當詳細的正則表達式像

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

regex demo

詳細

  • ^ - 線
  • 開始
  • ENV\[' - 字面ENV['
  • (.*?) - 第1組捕獲0+字符不是一個換行符其他儘可能少達第一個
  • '\] - 文字']文字
  • *= * - 一個=標誌可選的(0或更多)空間
  • '封閉 - 單引號
  • (.*?) - 組2捕獲0+比換行符其他儘可能少的字符到
  • ' - 最終'在......
  • $ - 行結束。

這裏是一個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"="的slimed-下串,用空格包圍,然後將得到的數組轉換成哈希值。

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會爲您正確轉義正則表達式的特殊字符。