2013-04-14 50 views
-2

我得到一个字符串,其中包含以下重复模式:标签(一个单词),冒号,一些文本(几乎任何东西,甚至空)。例如:Ruby:根据冒号分隔符从字符串创建一个双数组

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

+0

有什么办法可以改变输入结构,或者是来源你控制范围之外?这是可行的,但不是一个解析友好的格式。如果标签/文本对之间有其他分隔符,这将非常有帮助。 –

+0

我同意这不是很解析友好。我希望我能改变这种结构。 – jen

回答

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阵列英寸

编辑:如果您的值(不是键)包含以“:”(冒号,空格)结尾的单词,则表示您的正则表达式有问题,因为正则表达式会扫描此模式以分离输入。

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

+0

这工作很好。我只是稍作修改,因为我发现其中一个键(不在上面的示例中)包含正斜杠,所以我写道:arglist = medinfo.split /([\ d \ w _ \ /] +:)/非常感谢。 – jen

+0

欢迎您:) 顺便说一句:如果您发现我的答案可以接受。欢迎您接受;) – tessi

+0

在'[\ d \ w_]''\ d'和'_'是多余的。 '\ w'已经相当于'[a-zA-Z0-9_]'。 –

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 
+0

感谢您的输入。我最初的代码更聪明的版本。 – jen

相关问题