Ruby 将字符串中的数据格式化为数组?
我需要将数据从字符串转换为数组。字符串如下所示:Ruby 将字符串中的数据格式化为数组?,ruby,arrays,string,Ruby,Arrays,String,我需要将数据从字符串转换为数组。字符串如下所示: {a,b,c{1,2,3},d,e,f{11,22,33},g} 我要接收的数组应如下所示: [a, b, c1, c2, c3, d, e, f11, f22, f33, g] 我尝试使用split方法,但效果很差 arr = str.split(' '); keys = arr[0][2..-2] keys = keys.split(',') 您对如何实现它有什么想法吗?您需要在第一步中arr=str.split(','),因为值之间没
{a,b,c{1,2,3},d,e,f{11,22,33},g}
我要接收的数组应如下所示:
[a, b, c1, c2, c3, d, e, f11, f22, f33, g]
我尝试使用split
方法,但效果很差
arr = str.split(' ');
keys = arr[0][2..-2]
keys = keys.split(',')
您对如何实现它有什么想法吗?您需要在第一步中
arr=str.split(',')
,因为值之间没有空格
还请记住,您也需要处理{}
。以下是我要使用的:
string = '{a,b,c{1,2,3},d,e,f{11,22,33},g}'
array = string.scan(/[a-z](?:{.+?})?/).flat_map{ |s|
if s['{']
prefix = s[0]
values = s.scan(/\d+/)
([prefix] * values.size).zip(values).map(&:join)
else
s
end
}
array # => ["a", "b", "c1", "c2", "c3", "d", "e", "f11", "f22", "f33", "g"]
下面是它的工作原理:
string.scan(/[a-z](?:{.+?})?/) # => ["a", "b", "c{1,2,3}", "d", "e", "f{11,22,33}", "g"]
返回分块的字符串,查找单个字母,后跟可选字符串{
,其中包含一些文本,然后查找}
values = s.scan(/\d+/) # => ["1", "2", "3"], ["11", "22", "33"]
当它在平面地图中运行时,如果找到{
,则会扫描出数字
([prefix] * values.size).zip(values).map(&:join) # => ["c1", "c2", "c3"], ["f11", "f22", "f33"]
然后创建一个前缀
数组,该数组的元素数与值
的元素数相同,并将其压缩在一起,结果是:
[["c", "1"], ["c", "2"], ["c", "3"]], [["f", "11"], ["f", "22"], ["f", "33"]]
join
将这些子数组粘在一起。而flat\u map
将创建的任何子数组展平,因此生成的输出是单个数组。对于我来说,使用简单的regex和gsubing很有效(尽管Tin Man的解决方案比ruby更好):
它的工作方式是,它首先查找字母表后跟大括号和数字的组(如c{1,2,3}
)
对于每个这样的组,它都会通过使用“”、“
和“”、“
并移除大括号对其进行修改
接下来,它用原始字符串中修改的组替换这些组
最后,它删除原始字符串中的起始大括号和结束大括号,并将其转换为数组。您显示的数组不是字符串数组。这意味着您有一个局部变量或一个方法
a
,等等。这是您想要的吗?{a,b,c{1,2,3},d,e,f{11,22,33},g}
不是有效的ruby语法..给我们实际的数据。它只是一个字符串content str='{a,b,c{1,2,3},d,e,f{11,22,33},g}'谢谢,这正是我一直在寻找的。
def my_string_to_array(input_string)
groups = input_string.scan(/\w+\{.*?\}/)
groups.each do |group|
modified = group.gsub(',', ",#{group.match(/\w+/)[0]}").delete("{}")
input_string.gsub!(group, modified)
end
created_array = input_string.delete("{}").split(',')
end
string = '{a,b,c{1,2,3},d,e,f{11,22,33},g}'
my_string_to_array(string)
=> ["a", "b", "c1", "c2", "c3", "d", "e", "f11", "f22", "f33", "g"]