-2

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

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

我正在尝试根据标签和以下文本创建一个二维数组:

[["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​​ 解决方案。

4

2 回答 2

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:在代码中发现了一个小缺陷。每个键都以“:”结尾。不必要的子字符串现在也被剥离了。

于 2013-04-14T12:09:33.957 回答
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
于 2013-04-14T16:03:36.100 回答