Используйте негативный взгляд вперед для следующего кронштейна полукокса быть закрывающая скобка:
String[] pairs = s.split(", *(?![^\\[\\]]*\\])");
Если вы хотите пойти один шаг дальше и проанализировать пары ключ: значение на карте (в одной строке!):
Map<String, String> map = Arrays.stream(s.replaceAll("^.|.$", "").split(", *(?![^\\[\\]]*\\])"))
.map(p -> p.split(":")).collect(Collectors.toMap(a -> a[0], a -> a[1]));
Вы могли бы продолжать идти и рекурсивно разобрать значения в String
, String[]
или Map<String, Object>
, но тогда вы написали вы владеете JSon парсер, и вы бы лучше использовать библиотеку.
Некоторые тестовый код для базового решения:
String s = "{key1:[1239,6783], key2:[323], key3:[{id: 61519, chart: false}], key4:[6,34,56], key5:[325432,545434]}";
Arrays.stream(s.split(", *(?![^\\[\\]]*\\])")).forEach(System.out::println);
Выход:
{key1:[1239,6783]
key2:[323]
key3:[{id: 61519, chart: false}]
key4:[6,34,56]
key5:[325432,545434]}
Некоторые тест код на-карте решения:
String s = "{key1:[1239,6783], key2:[323], key3:[{id: 61519, chart: false}], key4:[6,34,56], key5:[325432,545434]}";
Map<String, String> map = Arrays.stream(s.replaceAll("^.|.$", "").split(", *(?![^\\[\\]]*\\])"))
.map(p -> p.split(":")).collect(Collectors.toMap(a -> a[0], a -> a[1]));
System.out.println(map);
Выход:
{key1=[1239,6783], key2=[323], key5=[325432,545434], key3=[{id, key4=[6,34,56]}
Почему вы не использовать разделитель, как ' "],"'? –
Если значение может иметь вложенные массивы и объект, то это невозможно правильно разобрать с помощью Java regex. – nhahtdh