2013-05-18 28 views
0

說我有一個字符串,如如何將字符串拆分爲鍵值對?

"@a ipsum lorem @b dolor sit amet @c consectetur adipisicing" 

,我想轉換成數組(或散,或鍵和值的某種模式)

{ @a => "ipsum lorem", @b => "dolor sit amet", @c => "consectetur adipisicing" } 

這是可能的,如果是這樣如何做呢?

的一些要點:

  • 的密鑰是不大可能發生衝突 與字符串換句話說值的已知列表。
  • 該鍵被指定爲具有 符號@
  • 該鍵可以比一個字符長,例如, @key, @長鍵。
  • 我正在使用Ruby 1.9.3在Rails 3.2中工作。

回答

3
Hash[s.scan(/\@\w+/).zip s.split(/\s?\@\w+\s/).drop(1)] 
+0

這是一個很好的解決方案。我使用'Benchmark.measure'比較了此解決方案(0.000059)和Priti(0.000097)的性能。由於這個解決方案在提供的字符串上更快,我正在改變接受的答案。 –

4
s = "@a ipsum lorem @b dolor sit amet @c consectetur adipisicing" 
Hash[s.split(" ").slice_before(/@/).map{|k,*v|[k,v.join(" ")]}] 
#=> {"@a"=>"ipsum lorem", "@b"=>"dolor sit amet", "@c"=>"consectetur adipisicing"} 
+0

感謝@priti,這是一個完美的解決方案!一個問題 - 如果我沒有符號@而是有一個值列表,可以將它們傳遞給'splice_beofore'方法嗎?類似於's.chars.splice_before([「a」,「b」,「c」])' –

+0

如果變量名稱不是單個字符,則會出現問題。 s =「@alpha ipsum lorem @b dolor sit amet @c consectetur adipisicing」 –

+0

@Rahulgarg這是所有關於編程,你指向的東西,如果這種情況也可以這樣處理,或者我也可以使用其他技術。但根據OP的帖子,我使用了這種技術。並且它將用於當前的例子。 –

0
Hash[ 
    string 
    .scan(/(@\S+)\s+(.+?)(?=\[email protected]|\z)/) 
    .map{|k, v| [instance_variable_get(k), v]} 
] 
+0

謝謝@sawa你能解釋更多關於這個'instance_variable_get'方法的信息。對於main:Object' –

+0

'instance_variable_get',我得到'NoMethodError:未定義方法'instance_varaible_get'作爲字符串給出的實例變量。例如,如果您處於某個上下文('self'爲'foo'),其中'@ bar'被定義爲'5',則'foo.instance_variable_get(「@ bar」)'爲'5'。 – sawa

+0

@ Gaurish Sharma謝謝你糾正我的錯字。這是至關重要的。 – sawa

1
s = "@a ipsum lorem @b dolor sit amet @c consectetur adipisicing" 
hs = {} 
s.split('@').drop(1).each{|val| tmp = val.split(' '); hs["@#{tmp.shift}"] = tmp.join(' ') } 
# puts hs 
#=>{"@a"=>"ipsum lorem", "@b"=>"dolor sit amet", "@c"=>"consectetur adipisicing"} 
+0

謝謝,這個作品!一個問題 - 如果我不使用符號@而是使用值列表,可以將它們傳遞給split方法嗎?有點像's。分裂([「a」,「b」,「c」])' –

+0

但是然後「a」「b」「c」也可以是數值..就像s =「@aab @bxyz」 –

+0

上面是非常具體的,假設你的變量被定義了@ var_names,並且rest是它的值,直到下一個@ var被定義; –

相關問題