Предполагая, что у вас есть допустимая строка в одинарных кавычках, вот опция, которая работает для вашего тестового ввода, но может столкнуться с проблемами при вложении, причем регулярное выражение испытывает затруднения при сопоставлении .
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, с остальной частью их структуры.
и repl .