将字符串格式化为数组?

时间:2014-01-09 17:11:43

标签: 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(',')

您对如何实施有任何想法吗?

3 个答案:

答案 0 :(得分:1)

以下是我使用的内容:

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

当它在flat_map中运行时,如果找到{,则会扫描出数字。

([prefix] * values.size).zip(values).map(&:join) # => ["c1", "c2", "c3"], ["f11", "f22", "f33"]

然后创建prefix的数组,其元素数量与values相同,并将其压缩在一起,从而产生:

[["c", "1"], ["c", "2"], ["c", "3"]], [["f", "11"], ["f", "22"], ["f", "33"]]

join将这些子阵列粘在一起。并flat_map展平所有创建的子数组,因此生成的输出是单个数组。

答案 1 :(得分:0)

您需要在第一步中arr = str.split(','),因为值之间没有空格。

另请注意,您也需要处理{}

答案 2 :(得分:0)

这对我来说简单的正则表达式和gsubing(虽然Tin Man的解决方案更好的红宝石):

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

它的工作方式是首先找到具有字母和数字的字母组(如c{1,2,3}

对于每个此类组,它会通过gsubing ','',<alphabet>'并删除大括号来修改它。

接下来,它将这些组替换为原始字符串中的已修改组。

最后,它删除原始字符串中的起始和结束括号,并将其转换为数组。