Я бы не советовал регулярный запрос от Барта, я нашел решение для синтаксического анализа лучше в этом конкретном случае (как предложил Фабиан). Я пробовал решение regex и собственную реализацию синтаксического анализа. Я обнаружил, что:
Мое решение и тест ниже.
String tested = "foo,bar,c;qual=\"baz,blurb\",d;junk=\"quux,syzygy\",";
long start = System.nanoTime();
String[] tokens = tested.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
long timeWithSplitting = System.nanoTime() - start;
start = System.nanoTime();
List<String> tokensList = new ArrayList<String>();
boolean inQuotes = false;
StringBuilder b = new StringBuilder();
for (char c : tested.toCharArray()) {
switch (c) {
case ',':
if (inQuotes) {
b.append(c);
} else {
tokensList.add(b.toString());
b = new StringBuilder();
}
break;
case '\"':
inQuotes = !inQuotes;
default:
b.append(c);
break;
}
}
tokensList.add(b.toString());
long timeWithParsing = System.nanoTime() - start;
System.out.println(Arrays.toString(tokens));
System.out.println(tokensList.toString());
System.out.printf("Time with splitting:\t%10d\n",timeWithSplitting);
System.out.printf("Time with parsing:\t%10d\n",timeWithParsing);
Конечно, вы можете изменить переключатель на другое -в этом фрагменте, если вы чувствуете себя некомфортно с его уродством. Обратите внимание, что после переключения с разделителем отсутствует перерыв. StringBuilder был выбран вместо StringBuffer по дизайну, чтобы увеличить скорость, когда безопасность потоков не имеет значения.