2013-03-31 4 views
0

У меня есть эта строка, что я пытаюсь разделить на вложенные массивы:рубин карта вложен массив

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

Это до сих пор:

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

успешно делит его на:

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

Я пытаюсь добавить дополнительную карту:

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

, которая возвращает:

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

однако я после того, как вместо этого:

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

Карта, как представляется, применяя себя весь массив 2-го уровня вместо каждого элемента внутри него , Что я здесь делаю неправильно?

ответ

1

Во второй карте вы ваш раскалывают только первый элемент вместо spliting каждый элемент с картой

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

Также вы можете очистить его немного извлекая регулярное выражение в переменной

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

x.scan(/\{(.*?)\}/).map {|m| m[0].split(regex)}.map {|m| m.map {|n| n.split(regex)}} 
Смежные вопросы