如何将以下转换为数组或哈希?

时间:2015-10-07 03:35:31

标签: ruby

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

如何将其提取到[a,b,c,d,e,f,g,h]

我知道我可以使用split,但看起来它只能使用一个分隔符。

或如何转换为哈希?

4 个答案:

答案 0 :(得分: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"]

滥用Ruby的其他有趣方式:

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"]

同时检查Cary和GamesBrainiac的答案以获得更多选择:)

答案 1 :(得分: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"}

答案 2 :(得分: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"] 

答案 3 :(得分:0)

我会使用#include<stdio.h> #include<conio.h> void main() { int i; int number=2; int total=1; int power=64; int totalSum=1; for(i=1;i<=power;) { total=total*number; totalSum=totalSum+total; i++; } printf("%d\n",total); printf("Sum=%d",totalSum); }

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"] =。然后,我们只需&字符串。