Ruby hash.update / map值仅包含在括号内

时间:2013-03-31 23:09:10

标签: ruby regex dictionary split

我有以下哈希数组:

[
  {"type"=>"paragaph", "class"=>"red", "content"=>"[class:intro|body:This is the introduction paragraph.][body:This is the second paragraph.]"}, 
  {"type"=>"image", "class"=>"grid", "content"=>"[id:1|title:image1][id:2|title:image2][id:3|title:image3]"}
]

我正在尝试将包含方括号的哈希值转换为值数组。这非常好 - 问题在于它会破坏所有其他不包含方括号的哈希值。

pipe_regex = /\|\s*(?=[^\[\]]*(?:\[|$))/
colon_regex = /\:\s*(?=[^\[\]]*(?:\[|$))/

array_hash.map {|m| m.update(m) {|k,v| v.scan(/\[(.*?)\]/).map {|m| m[0].split(pipe_regex)}.map {|m| m.map {|n| n.split(colon_regex)}}}}

它有点乱,但上面的代码找到每个哈希值并根据'[]'字符划分它们 - 但似乎也没有'[]'来销毁任何东西。然后它继续拆分为'|'然后拆分':'看起来效果很好。

然后我将值转换为哈希值,因此包含方括号的原始值现在是哈希数组。

array_hash.map {|m| m.update(m) {|k,v| v.map {|n| Hash[n]}}}

这似乎也很好。一切的最终结果都归结为:

[
  {"type"=>[], "class"=>[], "content"=>[{"class"=>"intro", "body"=>"This is the introduction paragraph."}, {"body"=>"This is the second paragraph."}]}, 
  {"type"=>[], "class"=>[], "content"=>[{"id"=>"1", "title"=>"image1"}, {"id"=>"2", "title"=>"image2"}, {"id"=>"3", "title"=>"image3"}]}
] 

如何让.scan(/\[(.*?)\]/)仅适用于包含'[]'的字符串?所以这就是结果:

[
  {"type"=>"paragraph", "class"=>"red", "content"=>[{"class"=>"intro", "body"=>"This is the introduction paragraph."}, {"body"=>"This is the second paragraph."}]}, 
  {"type"=>"image", "class"=>"grid", "content"=>[{"id"=>"1", "title"=>"image1"}, {"id"=>"2", "title"=>"image2"}, {"id"=>"3", "title"=>"image3"}]}
]

1 个答案:

答案 0 :(得分:0)

工作算法:

array_hash.map {|m| m.update(m) {|k,v| v[/\[.*\]/] ? v.scan(/\[(.*?)\]/).map {|m| m[0].split(pipe_regex)}.map {|m| m.map {|n| n.split(colon_regex)}} : v}}
array_hash.map {|m| m.update(m) {|k,v| v.kind_of?(Array) ? v.map {|n| Hash[n]} : v}}