Вы можете попробовать это регулярное выражение:
str.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
Это разделяет строку на ,
, за которой следует четное число двойных кавычек. Другими словами, он разбивается на запятую вне двойных кавычек. Это будет работать, если у вас есть сбалансированные кавычки в вашей строке.
Объяснение:
, // Split on comma
(?= // Followed by
(?: // Start a non-capture group
[^"]* // 0 or more non-quote characters
" // 1 quote
[^"]* // 0 or more non-quote characters
" // 1 quote
)* // 0 or more repetition of non-capture group (multiple of 2 quotes will be even)
[^"]* // Finally 0 or more non-quotes
$ // Till the end (This is necessary, else every comma will satisfy the condition)
)
Вы даже можете ввести такой код в своем коде, используя модификатор (?x)
с вашим регулярным выражением. Модификатор игнорирует любые пробелы в вашем регулярном выражении, поэтому становится легче читать регулярное выражение, разбитое на несколько строк:
String[] arr = str.split("(?x) " +
", " + // Split on comma
"(?= " + // Followed by
" (?: " + // Start a non-capture group
" [^\"]* " + // 0 or more non-quote characters
" \" " + // 1 quote
" [^\"]* " + // 0 or more non-quote characters
" \" " + // 1 quote
" )* " + // 0 or more repetition of non-capture group (multiple of 2 quotes will be even)
" [^\"]* " + // Finally 0 or more non-quotes
" $ " + // Till the end (This is necessary, else every comma will satisfy the condition)
") " // End look-ahead
);