首页 > 解决方案 > 用逗号分割字符串,但不包括括号中的逗号

问题描述

我有一个字符串:

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[/\{.*?\}]}/]

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

标签: rubystringsplit

解决方案


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

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

这里的想法是使用负前瞻对不在括号内的任何逗号进行正则表达式拆分,然后将任何具有额外}s 的哈希与其结构的其余部分结合起来。


推荐阅读