0

我有以下哈希数组:

[
  {"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"}]}
]
4

1 回答 1

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}}
于 2013-03-31T23:55:05.597 回答