이 표현식은 "1 = 2,3 = (4 = 5,6 = 7)"이며이 중에서 해시를 만들고 싶습니다. - 1 => 2, 3 => (4 = 5,6 = 7). 2 회 통과 할 수 있습니다. 첫 번째 패스에서 (. *)를 (4; 5,6; 7)과 같이 변형 한 다음 두 번째 패스에서 분할 할 수 있습니다.이상한 문자열이 루비로 분할 되었습니까?
더 나은 솔루션이 있습니까?
이 표현식은 "1 = 2,3 = (4 = 5,6 = 7)"이며이 중에서 해시를 만들고 싶습니다. - 1 => 2, 3 => (4 = 5,6 = 7). 2 회 통과 할 수 있습니다. 첫 번째 패스에서 (. *)를 (4; 5,6; 7)과 같이 변형 한 다음 두 번째 패스에서 분할 할 수 있습니다.이상한 문자열이 루비로 분할 되었습니까?
더 나은 솔루션이 있습니까?
만큼 괄호는 일반 문자열로 취급되어 내부에 중첩 된 괄호에 대해 걱정하고 아무것도 할 필요하지 않는 : 당신이 중첩 된 해시를해야하는 경우
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"}}
여전히 중첩 된 괄호를 올바르게 처리하지 않습니다. 이를 위해 적절한 구문 분석기가 필요합니다.
필수 링크 : http://www.debuggex.com/r/ltye36gIFhLag31S/0 –
예제 출력 해시를 명확히 할 수 있습니까? 일반적인 Ruby 구문은 아닙니다. 중첩 된 해쉬'{1 => 2, 3 => {4 => 5, 6 => 7}}을 의미합니까? 아니면 원래 표현식'{1 => 2, 3 => "(4 = 5,6 = 7)"}'에서 중첩 구조를 보존하고 싶습니까? 또한 표현식의 값은 항상 숫자이며, 문자열로 처리해야합니다. {4 "="5 ","6 "=>"7 "}}' –
'(4 = 5,6 = 7)'은 {{"1 "=>"2 ","3 " 유효한 Ruby 객체가 아닙니다. – sawa