Ruby:根据冒号分隔符从字符串创建一个double数组

时间:2013-04-14 11:52:35

标签: ruby string multidimensional-array

我得到一个带有以下重复模式的字符串:label(一个单词),冒号,一些文本(几乎任何东西,甚至是空的)。例如:

"FileSize: 597262388 Duration_String: 1h 34mn Duration_string3: 01:34:12.564 Source_Duration:  Width: 712 Height: 360"

我正在尝试根据标签和以下文字创建一个2D数组:

[["FileSize", "597262388"], ["Duration_String", "1h 34mn"], ["Duration_string3", "01:34:12.564"], ["Source_Duration", ""],  ["Width", "712"], ["Height", "360"]]

我试过这段代码:

medinfo = "FileSize: 597262388 Duration_String: 1h 34mn Duration_string3: 01:34:12.564 Source_Duration:  Width: 712 Height: 360"
mi = medinfo.split(':')
s = []
mi.each do |x|
    x2 = x.split(/\W+/).last
    x1 = x.gsub(x2, '')
    s << x1
    s << x2
end
mi_pairs = (s[1..-1].each_slice 2).to_a

但它并不适用于所有情况,我觉得必须有一个更简单的ruby解决方案。

2 个答案:

答案 0 :(得分:2)

对于给定的案例,以下脚本似乎对我有用:

medinfo = "FileSize: 597262388 Duration_String: 1h 34mn Duration_string3: 01:34:12.564 Source_Duration:  Width: 712 Height: 360"
arglist = medinfo.split /([\d\w_]+: )/
result = []
arglist.each_index {|i| result << [arglist[i].strip[0..-2], arglist[i+1].strip] if i.odd?}

您会在result数组中找到结果。

编辑:你的正则表达式有问题,以防你的值(而不是键)包含一个以“:”(冒号,空格)结尾的单词,因为正则表达式会扫描此模式以分隔输入。

Edit2:在代码中发现了一个小缺陷。每个键都以“:”结尾。现在也剥离了不必要的子字符串。

答案 1 :(得分:1)

虽然您已经解决了问题,但这只是您问题的另一种解决方案:

medinfo = "FileSize: 597262388 Duration_String: 1h 34mn Duration_string3: 01:34:12.564 Source_Duration:  Width: 712 Height: 360"
str = medinfo.gsub(/([a-zA-Z_3]+)(:)/,'\1;')
mi = str.split(';')
s = []
mi.each do |x|
  x2 = x.split(/\W+/).last
  x1 = x.gsub(x2, '')
  s << x1.strip
  s << x2.strip
end
mi_pairs = (s[1..-1].each_slice 2).to_a