Разделить строку запятыми, но исключить запятые в скобках - PullRequest
0 голосов
/ 29 августа 2018

У меня есть строка:

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 голосов
/ 29 августа 2018

Предполагая, что у вас есть допустимая строка в одинарных кавычках, вот опция, которая работает для вашего тестового ввода, но может столкнуться с проблемами при вложении, причем регулярное выражение испытывает затруднения при сопоставлении .

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 .

...