2015-08-31 4 views
-2
String s = "{key1:[1239,6783], key2:[323], key3:[{id: 61519, chart: false}], key4:[6,34,56], key5:[325432,545434]}" 

нужно разделить вышеупомянутую строку с помощью «».Regexp разделить строку в Java

Ожидаемое:

s[0] = {key1:[1239,6783] 
s[1] = key2:[323] 
s[2] = key3:[{id: 61519,chart: false}] 
s[3] = key4:[6,34,56] 
s[4] = key5:[325432,545434]} 

Actual:

Splits by considering the commas which is present in the value pair too. 
s[0] = {key1:[1239 
s[1] = 6783] and it's goes on... 

Можно сделать вышеуказанную задачу с использованием регулярных выражений и Java? Если да, пожалуйста, предоставьте мне решение ...

+0

Почему вы не использовать разделитель, как ' "],"'? –

+0

Если значение может иметь вложенные массивы и объект, то это невозможно правильно разобрать с помощью Java regex. – nhahtdh

ответ

0

Просто разделить в соответствии с запятой, за которым следует key:

string.split(",\\s*(?=\\w+:\\[)") 

или

string.split(",\\s*(?=key\d+:\\[)") 
+0

Ох, забудьте добавить lookahead. Проверь сейчас.. –

0

Вы можете использовать это регулярное выражение на основе опережения:

String[] toks = s.split(",(?![^\\[\\]]*\\])\\s*"); 
for (String tok: toks) 
    System.out.printf("<%s>%n", tok); 

Выход:

<{key1:[1239,6783]> 
<key2:[323]> 
<key3:[{id: 61519, chart: false}]> 
<key4:[6,34,56]> 
<key5:[325432,545434]}> 

RegEx Demo

1

Если это приемлемый вариант, я предпочел бы перебирать матчи со следующим регулярным выражением:

\w+\s*:\s*\[[^]]+\] 

Regular expression visualization

Визуализация по Debuggex


В Java:

String s = "{key1:[1239,6783], key2:[323], key3:[{id: 61519, chart: false}], key4:[6,34,56], key5:[325432,545434]}"; 
Pattern p = Pattern.compile("\\w+\\s*:\\s*\\[[^]]+\\]"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

Печать:

key1:[1239,6783] 
key2:[323] 
key3:[{id: 61519, chart: false}] 
key4:[6,34,56] 
key5:[325432,545434] 
0

Используйте негативный взгляд вперед для следующего кронштейна полукокса быть закрывающая скобка:

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]} 
0

Вы могли бы просто использовать простой альтернативный регулярок разветвитель ("], ")

String s = ""{key1:[1239,6783], key2:[323], key3:[{id: 61519, chart: false}], key4:[6,34,56], key5:[325432,545434]}""; 

String[]tokens = s.split("], "); 

System.out.println(Arrays.toString(tokens)); 

PS: Это вынимает закрытие ]

Смежные вопросы