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