我需要做的是轉換是這樣的:紅寶石字符串轉換爲特定的陣列格式
"id,name,user[id,email]"
這個數組:
["id", "name", {"user"=>["id", "email"]}]
什麼是做到這一點的最好方法是什麼?我認爲像split
或scan
這樣的函數可以提供幫助,但是我並不瞭解正則表達式來解決這個問題。在生產中必須瞭解風險,使用eval
:
我需要做的是轉換是這樣的:紅寶石字符串轉換爲特定的陣列格式
"id,name,user[id,email]"
這個數組:
["id", "name", {"user"=>["id", "email"]}]
什麼是做到這一點的最好方法是什麼?我認爲像split
或scan
這樣的函數可以提供幫助,但是我並不瞭解正則表達式來解決這個問題。在生產中必須瞭解風險,使用eval
:
只是出於好奇:
▶ 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。
我可以做到這一點沒有eval? –
當我對'safe'進行評估時,我得到:'未定義的局部變量或方法'name'' –
這個錯誤只發生在rails中,'irb'不會發生。將解決它。謝謝。 –
string = "id,name,user[id,email]"
parts = string.split(/[\,,\[,\]]/)
[parts[0], parts[1], {parts[2] => [parts[3], parts[4]]}]
您可能還需要有一定的驗證,或者如果第一個ID應該是一樣的第二個不使用的所有部件。
選擇性模式中的太多逗號:) – mudasobwa
我還沒有完成! –
在我的例子案例工程。但是如果我有用戶[id,email],id,name「'?順序可以改變,字符串的數量可以改變,一切都可以改變,我的例子只是一個模式。@mudasobwa答案解決了我的問題,但我不想使用eval。 –
您的預期數組無效。 – sawa
什麼是上下文?我認爲如果你提供了一些關於你想要做什麼的背景知識,這可能會有所幫助。 –
@sawa將其編輯爲更多撥款。 Ruby將'[「id」,「name」,「user」=> [「id」,「email」]]'轉換爲'[「id」,「name」,{「user」=> [「id」, 「電子郵件」]}]'。在這個例子中,用戶成爲了數組中的散列。您可以嘗試在控制檯中鍵入我的原始數組。 –