Как разделить список через запятую в javascript, но не разбивать ничего внутри кавычек с нулевыми значениями - PullRequest
0 голосов
/ 08 октября 2019

У меня есть список, разделенный запятыми, который может содержать пустые значения и может содержать значения, заключенные в двойные кавычки, которые я не хочу разделять. Мне нужно создать массив с использованием этого разбиения, чтобы позже я мог зациклить его.

Я попытался использовать какое-то регулярное выражение соответствия, которое работает, за исключением того, что оно пропускает все нулевые значения, которые у меня есть. Я пытался использовать регулярные выражения, но не думаю, что мой синтаксис работает должным образом, так как он возвращает массив длиной 1.

. Этот код соответствия наиболее точно показывает, чтоЯ собираюсь

var s = 'To, Infinity, "And, Beyond",,Buzz Lightyear';
var array = s.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g);

Это синтаксис разбиения, который возвращает только длину массива 1

var s = 'To, Infinity, "And, Beyond",,Buzz Lightyear';
var array = s.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");

С функцией соответствия я ожидаю, что результат будет:

To
Infinity
And, Beyond

Buzz Lightyear

Однако мой вывод на самом деле

To
Infinity
And, Beyond
Buzz Lightyear

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Поскольку вы отметили веселье в своем вопросе, вы можете использовать встроенный анализатор весов. Обратите внимание, что ваша точная строка из вашего вопроса не будет работать, потому что есть пробел после запятой и перед «И, за». Если вы собираетесь заключить в кавычки поле CSV, нужно заключить в кавычки все поле (в противном случае кавычка рассматривается как часть значения.)

var serializer = SerializerFactory.getSerializer('delimited');

var s = 'To,Infinity,"And, Beyond",,Buzz Lightyear';
var split = new XML(serializer.toXML(s));
for each (var col in split.row.children()) {
    logger.info(col.toString());
}

Редактировать: я не создавал массив, так как высказал, что вам нужно только это для цикла, как показано выше, но если вам все еще нужен массив, вы можете сделать:

var arr = [];
for each (var col in split.row.children()) {
    arr.push(col.toString());
}
0 голосов
/ 08 октября 2019

Это должно работать в соответствии с вашими ожиданиями:

var s = 'To, Infinity, "And, Beyond",,Buzz Lightyear';
var array = s.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);

console.log(array);
...