Matrice imbricată cu hartă Ruby

Am acest șir pe care încerc să îl împart în matrice imbricate:

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

Asta pana acum:

x.scan(/\{(.*?)\}/).map {|m| m[0].split(/\|\s*(?=[^\[\]]*(?:\[|$))/)}

îl împarte cu succes în:

[
  ["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]"]
]

Încerc să adaug o hartă suplimentară:

x.scan(/\{(.*?)\}/).map {|m| m[0].split(/\|\s*(?=[^\[\]]*(?:\[|$))/)}.map {|m| m[0].split(/\:\s*(?=[^\[\]]*(?:\[|$))/)}

care returneaza:

[["type", "paragaph"], ["type", "image"]] 

cu toate acestea, sunt după asta:

[
  [['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]']]
]

Harta pare să se aplice întregii matrice de nivel 2 în loc de fiecare element din interiorul acesteia. Ce greșesc aici?


person Ryan King    schedule 31.03.2013    source sursă


Răspunsuri (1)


În a doua hartă, împărțiți doar primul element în loc să împărțiți fiecare element cu o hartă

x.scan(/\{(.*?)\}/).map {|m| m[0].split(/\|\s*(?=[^\[\]]*(?:\[|$))/)}.map {|m| m.map {|n| n.split(/\:\s*(?=[^\[\]]*(?:\[|$))/)}}

De asemenea, l-ați putea curăța puțin, extragând expresia regex într-o variabilă

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

x.scan(/\{(.*?)\}/).map {|m| m[0].split(regex)}.map {|m| m.map {|n| n.split(regex)}}
person Ismael    schedule 31.03.2013