Как разбить строку по запятой, кроме случая когда за ней следует пробел?

218
08 ноября 2017, 00:00

Есть строка 1,2,3,"4, A",B, 5,C,6,7,8. Подскажите пожалуйста, как ее разбить на подстроки по запятой но пропустив запятую + пробел? Ниже код который работает, может есть более простой вариант?

String s = "1,2,3,\"4, A\",B, 5,C,6,7,8";
String[] ss;
s = s.replaceAll(", ", "#%&"); // меняем "запятая + пробел" на любой символ
ss = s.split(",");
for (int i = 0; i < ss.length; i++) {
    System.out.println(ss[i].replaceAll("#%&", ", ")); // возвращаем запятую с пробелом обратно
}
Answer 1

Т.к. split принимает регулярное выражение, то можно использовать просмотр вперед с отрицанием:

String[] ss = s.split(",(?!\\s)");

Выражение ,(?!\s) означает: «запятая, если за ней не следует пробельный символ». Пробельный символ может быть любой, если нужно игнорировать именно пробел, то укажите его явно:

String[] ss = s.split(",(?! )");
Answer 2
String s = "1,2,3,\"4, A\",B, 5,C,6,7,8";
StringTokenizer st = new StringTokenizer(s, ",");
while(st.hasMoreTokens()){
    String nextToken = st.nextToken();
    if (!nextToken.equals(nextToken.trim())) System.out.print(",");
    else System.out.println("");
    System.out.print(nextToken);
}
READ ALSO
Связка Андроид приложения и MSQL Server 2014

Связка Андроид приложения и MSQL Server 2014

Никак не могу связать приложение с Msql server 2014Вопроc: связать можно любой выпуск MSQL или только Express ?

153
Зачем нужен класс FilterInputStream?

Зачем нужен класс FilterInputStream?

Просмотрев документацию и исходный код класса FilterInputStream, а также код его наследников, возник вопрос: зачем вообще нужен этот класс?

175
Как убрать анимацию вращения у Progress bar?

Как убрать анимацию вращения у Progress bar?

Доброго времени суток, необходимо на круглом progress bar отображать рейтинг заведенияТ

206