2012-04-23 9 views
1

我有一个从API,它看起来像这样的输出......(它是一个字符串)的字符串(那看起来像是一个数组)到一个数组的Ruby

[[2121212,212121,asd],[2323232,23232323,qasdasd]] 

它是一个字符串 - 不是一个数组。我想将其转换为一个数组,然后提取每个阵列中的前两个元素嵌套数组中:

[2121212,212121],[2323232,23232323] 

什么是做到这一点的红宝石的最佳方式?我可以使用正则表达式并提取 - 但基本上该字符串已经是一个数组,但是该类是一个字符串。

我试图

array.push(response) 

但只是把字符串中的数组作为一个元素。我想什么会是不错的是to_array方法

+0

[Ruby:将嵌套数组的字符串表示解析为数组?](http://stackoverflow.com/questions/4477127/ruby-parsing-a-string-representation-of-nested-arrays -into-an-array) – Mischa 2012-04-23 09:32:53

+0

这不一样 - JSON和eval都不会处理没有引号的字符串。如果字符串像'asd'那么简单,我只是通过regexp为它们添加引号,然后使用JSON.parse或者eval:'eval str.gsub(/([a-zA-Z] +)/, '''\ 1“')' – 2012-04-23 09:37:59

+0

Lukas - 对不起字符串会改变 - 它们总是在语法上相同,即[element,element,element]我可以调用.to_json方法并将其返回为[[element,元素,元素'] – 2012-04-23 09:41:18

回答

0

假设这是一个JSON响应(如果有的话,它是严重畸形,你应该跟那些负责此),你可以写东西喜欢的人:

require 'json' 

input= '[[2121212,212121,Asd],[2323232,23232323,qasdasd]]' 
input.gsub!(/([A-Za-z ]+)/,'"\1"') 
json = JSON.parse input 
output = json.map{|x| x[0...2]} 
p output 

此打印

[[2121212, 212121], [2323232, 23232323]] 
+0

如果你的代码也分析有效的json,你应该改进这种正则表达式,尽管它不会引用已经引用的字符串。但我会把这个留给你:) – 2012-04-25 18:25:23

0

使用eval是非常糟糕的,但我没有其他简单的选择。

test_str = "[[2121212,212121,asd],[2323232,23232323,qasdasd]]" 
test_str.gsub!(/([a-z]+)/) do 
    "'#{$1}'" 
end 
=> "[[2121212,212121,'asd'],[2323232,23232323,'qasdasd']]" 
test_array = eval(test_str) 
=> [[2121212, 212121, "asd"], [2323232, 23232323, "qasdasd"]] 
test_array.each do |element| 
    element.delete(element.last) 
end 
=> [[2121212, 212121], [2323232, 23232323]] 
+0

你绝对有其他的选择,而不是'eval',也就是'JSON.parse'。另外,你的gsub可以不带块:'str.gsub!(/([az] +)/' '“\\ 1”')'。 – d11wtq 2012-04-23 11:46:08

+0

感谢您的建议,但JSON.parse(“[[2121212,212121,asd],[2323232,23232323,qasdasd]]”) JSON :: ParserError:399:意外令牌在'asd],[2323232,23232323,qasdasd]]' – 2012-04-23 11:55:38

+0

@soundar:但是你是'eval'ling的东西可以很容易'JSON.parse'd,如果你只改变了'''#{$ 1 }'“'转换为'”\“#$ 1 \”“'然后你就会产生像'[[21212,212,“asd”],...]'',这是有效的JSON。 – Ashe 2012-04-23 12:54:15

2

您将需要无论如何使用正则表达式,如果没有的eval(shrudder ...),这是最短的一个

str = "[[2121212,212121,asd],[2323232,23232323,qasdasd],[2424242,24242424,qasdasd]]" 
p str.scan(/(\d+),(\d+)/) 

=>[["2121212", "212121"], ["2323232", "23232323"], ["2424242", "24242424"]] 
相关问题