2013-08-26 37 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)」}'的嵌套結構。此外,表達式中的值是否總是數字,或者它們是否應視爲字符串,例如'{「1」=>「2」,「3」=> {「4」=>「5」,「6」=>「7」}}' –

+0

'(4 = 5,6 = 7)不是有效的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 –