2016-08-01 2 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+ 가능한 한 적은 수의 개행 문자가 아닌 문자 - 작은 따옴표
  • (.*?) - 옵션 (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 공백으로 둘러싸인 "="에 slimed 다운 문자열을 제거 할 수 있으며, 다음 해시 결과 배열을 변환합니다. Regexp::union 당신을 위해 정규 표현식의 특수 문자 이스케이프를한다는 것을

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"} 

알 수 있습니다.

관련 문제