2016-08-01 6 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+文字最初
  • '\] - リテラル']テキスト
  • *= * - アップ
  • '族2捕捉0+できるだけ少ない改行以外の文字 - 単一引用符
  • (.*?) - オプション(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スライムダウン文字列、その後、ハッシュへの結果の配列を変換します。

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はあなたのための正規表現の特殊文字のエスケープをしていることに注意してください。

関連する問題