我需要将数据从字符串转换为数组。字符串如下所示:
{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(',')
您对如何实施有任何想法吗?
答案 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>'
并删除大括号来修改它。
接下来,它将这些组替换为原始字符串中的已修改组。
最后,它删除原始字符串中的起始和结束括号,并将其转换为数组。