2013-08-26 3 views
-1

이 표현식은 "1 = 2,3 = (4 = 5,6 = 7)"이며이 중에서 해시를 만들고 싶습니다. - 1 => 2, 3 => (4 = 5,6 = 7). 2 회 통과 할 수 있습니다. 첫 번째 패스에서 (. *)를 (4; 5,6; 7)과 같이 변형 한 다음 두 번째 패스에서 분할 할 수 있습니다.이상한 문자열이 루비로 분할 되었습니까?

더 나은 솔루션이 있습니까?

+2

예제 출력 해시를 명확히 할 수 있습니까? 일반적인 Ruby 구문은 아닙니다. 중첩 된 해쉬'{1 => 2, 3 => {4 => 5, 6 => 7}}을 의미합니까? 아니면 원래 표현식'{1 => 2, 3 => "(4 = 5,6 = 7)"}'에서 중첩 구조를 보존하고 싶습니까? 또한 표현식의 값은 항상 숫자이며, 문자열로 처리해야합니다. {4 "="5 ","6 "=>"7 "}}' –

+0

'(4 = 5,6 = 7)'은 {{"1 "=>"2 ","3 " 유효한 Ruby 객체가 아닙니다. – sawa

답변

3

만큼 괄호는 일반 문자열로 취급되어 내부에 중첩 된 괄호에 대해 걱정하고 아무것도 할 필요하지 않는 : 당신이 중첩 된 해시를해야하는 경우

str = "1=2,3=(4=5,6=7)" 

Hash[str.scan(/([^=,]+)=(\([^\)]+\)|[^=,]+)/)] 
# => {"1"=>"2", "3"=>"(4=5,6=7)"} 

는, 재귀 적 방법을 사용 :

def hashify(str) 
    arr = str.scan(/([^=,]+)=(\([^\)]+\)|[^=,]+)/).map do |key, val| 
    if val[0] == '(' && val[-1] == ')' 
     [key, hashify(val[1..-2])] 
    else 
     [key, val] 
    end 
    end 
    Hash[arr] 
end 

hashify "1=2,3=(4=5,6=7)" 
# => {"1"=>"2", "3"=>{"4"=>"5", "6"=>"7"}} 

여전히 중첩 된 괄호를 올바르게 처리하지 않습니다. 이를 위해 적절한 구문 분석기가 필요합니다.

+1

필수 링크 : http://www.debuggex.com/r/ltye36gIFhLag31S/0 –

관련 문제