Я знаю, теперь у меня две проблемы. Но я получаю удовольствие!
Я начал с этот совет, чтобы не попробовать и не разбивать, а вместо этого сопоставлять то, что является приемлемым полем, и расширяется оттуда до этого выражение.
final Pattern pattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?=,|$)");
Выражение выглядит следующим образом без раздражающих экранированных кавычек:
"([^"]*)"|(?<=,|^)([^,]*)(?=,|$)
Это хорошо работает для меня - либо оно соответствует "двум кавычкам, и тому, что между ними", либо "что-то между началом строки или запятой, а также концом строки или запятой". Итерация по матчи дает мне все поля, даже если они пусты. Например,
the quick, "brown, fox jumps", over, "the",,"lazy dog"
разбивается на
the quick
"brown, fox jumps"
over
"the"
"lazy dog"
Отлично! Теперь я хочу отбросить кавычки, поэтому я добавил lookahead и lookbehind non-captureing groups, как я делал для запятых.
final Pattern pattern = Pattern.compile("(?<=\")([^\"]*)(?=\")|(?<=,|^)([^,]*)(?=,|$)");
снова выражение:
(?<=")([^"]*)(?=")|(?<=,|^)([^,]*)(?=,|$)
Вместо желаемого результата
the quick
brown, fox jumps
over
the
lazy dog
теперь я получаю этот пробой:
the quick
"brown
fox jumps"
,over,
"the"
,,
"lazy dog"
Что мне не хватает?