2015-04-29 71 views
2

我需要做的是轉換是這樣的:紅寶石字符串轉換爲特定的陣列格式

"id,name,user[id,email]" 

這個數組:

["id", "name", {"user"=>["id", "email"]}] 

什麼是做到這一點的最好方法是什麼?我認爲像splitscan這樣的函數可以提供幫助,但是我並不瞭解正則表達式來解決這個問題。在生產中必須瞭解風險,使用eval

+0

您的預期數組無效。 – sawa

+0

什麼是上下文?我認爲如果你提供了一些關於你想要做什麼的背景知識,這可能會有所幫助。 –

+0

@sawa將其編輯爲更多撥款。 Ruby將'[「id」,「name」,「user」=> [「id」,「email」]]'轉換爲'[「id」,「name」,{「user」=> [「id」, 「電子郵件」]}]'。在這個例子中,用戶成爲了數組中的散列。您可以嘗試在控制檯中鍵入我的原始數組。 –

回答

3

只是出於好奇:

▶ str = "id,name,user[id,email]" 
▶ eval "[#{str.gsub(/(\w+)\[(.*?)\]/, '{\1=>[\2]}').gsub(/\w+/, ':\0')}]" 
#⇒ [ 
# [0] :id, 
# [1] :name, 
# [2] { 
# :user => [ 
#  [0] :id, 
#  [1] :email 
# ] 
# } 
#] 

Disclamer

UPD安全eval ING(注意,每ASCII \w符號轉換到它的從UTF-8寬的一對,以防止注射;不在身邊最好的方式,但它工作得很好,除非你有一個寬字符命名紅寶石功能):

▶ safe = str.gsub(/\w/) do |e| 
▷ e.each_codepoint.map do |cp| 
▷  cp + 0xFF00 - 0x0020 
▷ end.pack('U') 
▷ end 
#⇒ "id,name,user[id,email]" 
▶ eval "[#{safe.gsub(/(\p{L}+)\[(.*?)\]/, '{\1=>[\2]}').gsub(/\p{L}+/, ':\0')}]" 
#⇒ [ 
# [0] :id, 
# [1] :name, 
# [2] { 
# :user => [ 
#  [0] :id, 
#  [1] :email 
# ] 
# } 
#] 

現在您可以自由地將密鑰從寬字符轉回ASCII。

+0

我可以做到這一點沒有eval? –

+0

當我對'safe'進行評估時,我得到:'未定義的局部變量或方法'name'' –

+0

這個錯誤只發生在rails中,'irb'不會發生。將解決它。謝謝。 –

0
string = "id,name,user[id,email]" 
parts = string.split(/[\,,\[,\]]/) 
[parts[0], parts[1], {parts[2] => [parts[3], parts[4]]}] 

您可能還需要有一定的驗證,或者如果第一個ID應該是一樣的第二個不使用的所有部件。

+0

選擇性模式中的太多逗號:) – mudasobwa

+0

我還沒有完成! –

+0

在我的例子案例工程。但是如果我有用戶[id,email],id,name「'?順序可以改變,字符串的數量可以改變,一切都可以改變,我的例子只是一個模式。@mudasobwa答案解決了我的問題,但我不想使用eval。 –