2015-10-07 65 views
0
a=b&c=d&e=f&g=h 

如何提取到[a,b,c,d,e,f,g,h]如何將以下內容轉換爲數組或散列?

這個我知道我可以使用拆分,但它看起來像它只能只用一個劃。

或如何轉換爲散列?

+1

你通過某種網絡請求來做到這一點?在那裏,是那些查詢參數? – Makoto

+0

不,它不是查詢字符串,它是來自某個web post的響應 –

回答

0

我會用的是gsub

irb(main):001:0> s = "a=b&c=d&e=f&g=h" 
=> "a=b&c=d&e=f&g=h" 
irb(main):004:0> s.gsub(/[\=\&]/, " ").split() 
=> ["a", "b", "c", "d", "e", "f", "g", "h"] 

所以,我們在這裏所做的是用一個空格替換的=&所有出現。然後我們只需split這個字符串。

5

分裂FTW(即這樣做的最直接的,簡單的方法是):濫用紅寶石的

irb(main):001:0> s = "a=b&c=d&e=f&g=h" 
=> "a=b&c=d&e=f&g=h" 
irb(main):002:0> s.split(/[=&]/) 
=> ["a", "b", "c", "d", "e", "f", "g", "h"] 

其他有趣的方式:

irb(main):001:0> s = "a=b&c=d&e=f&g=h" 
=> "a=b&c=d&e=f&g=h" 
irb(main):002:0> s.split('=').collect{|x| x.split('&')}.flatten 
=> ["a", "b", "c", "d", "e", "f", "g", "h"] 
irb(main):003:0> ['=','&'].inject(s) {|t, n| t.split(n).join()}.split('') 
=> ["a", "b", "c", "d", "e", "f", "g", "h"] 

還要檢查卡里的和GamesBrainiac對更多的選擇答案:)

+1

感謝!我對紅寶石有些生疏,我不知道你能做到這一點。 –

+0

肯定:http://ruby-doc.org/core-2.2.0/String.html#method-i-split – Mircea

+1

您可以取代'collect'和'flatten'用'flat_collect',呃,我的意思是[可枚舉#flat_map](http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-flat_map)。 –

1

你可以很容易地用這樣的事情做一個哈希:

myHash = {} 
strSplit = "a=b&c=d&e=f&g=h".split("&") 
for pair in strSplit 
    keyValueSplit = pair.split("=") 
    myHash[keyValueSplit[0]] = keyValueSplit[1] 
end 

myHash看起來像這樣到底{"a"=>"b", "c"=>"d", "e"=>"f", "g"=>"h"}

1

@ MIREA的回答是最好的,但這裏的另一個:

s = "a=b&c=d&e=f&g=h" 

s.scan /[a-z]/ 
    #=> ["a", "b", "c", "d", "e", "f", "g", "h"] 

正則表達式可以作爲必修課的調整。例如:

"123a=b&c=d&E=f&g=h".scan /[A-Za-z0-9]/ 
    #=> ["1", "2", "3", "a", "b", "c", "d", "E", "f", "g", "h"] 

"1-2-3a=$b&c=d&e=f&g=h".scan /[^=&]/ 
    #=> ["1", "-", "2", "-", "3", "a", "$", "b", "c", "d", "e", "f", "g", "h"] 

等。

如果字符的字符串所需的只是追加+的字符類:

"123a=b&ccc=d&E=f&gg=h".scan /[A-Za-z0-9]+/ 
    #=> ["123a", "b", "ccc", "d", "E", "f", "gg", "h"] 

如果字符串中的示例所示的交流形式,這些工作還有:

(0..s.size).step(2).map { |i| s[i] } 
    #=> ["a", "b", "c", "d", "e", "f", "g", "h"] 

s.each_char.each_slice(2).map(&:first) 
    #=> ["a", "b", "c", "d", "e", "f", "g", "h"] 
+1

謝謝:)你的答案的小挑剔:它依賴於輸入字符串的結構。例如:test = 1023&nottest = 99a will not work – Mircea

+0

@Mircea,我認爲這是一個給定的,但你有一個好點。將調整我的答案。 –

+0

這裏有2種替代方法:1)s.split('=')。collect {| x | x.split( '&')}。flatten 2)['=','&']。inject(s){| t,n | t.split(N)。加入()}。分裂( '') – Mircea