按逗号分隔字符串,但括号中不包含逗号

时间:2018-08-29 01:02:40

标签: ruby string split

我有一个字符串:

str = "99,{b:["a1":"0","s1":"0"],c:[{"a2":"0","s2":"0"}]},-98,97,[11,22,33],96,-95,{"b2":"3"}"

我想按如下方式分割它:

v1= 99
v2 = {b:["a1": "0", "s1": "0"],c:[{"a2": "0", "s2": "0"}]}
v3 = -98
v4 = 97
v5 = [11,22,33]
v6 = 96
v7 = -95
v8 = {"b2":"3"}

我有这个正则表达式来获取v2的内容:

str[/\{.*?\}]}/]

但我无法获得其他内容详细信息。

1 个答案:

答案 0 :(得分:1)

假设您有一个有效的单引号字符串,这是一个适用于您的测试输入的选项,但可能会遇到嵌套问题,即正则表达式has difficulty matching

str = '99,{b:["a1":"0","s1":"0"],c:[{"a2":"0","s2":"0"}]},-98,97,[11,22,33],96,-95,{"b2":"3"}'

puts (str.split(/,(?![^\[]*\])/).inject([]) do |a, e|
  if e.count("{") < e.count("}")
    a[-1] += "," + e
  else
    a << e
  end
  a
end)

输出:

99
{b:["a1":"0","s1":"0"],c:[{"a2":"0","s2":"0"}]}
-98
97
[11,22,33]
96
-95
{"b2":"3"}

这里的想法是使用否定先行对不在方括号内的任何逗号进行正则表达式拆分,然后将具有多余}的所有散列与其余结构结合起来。

还有一个repl