Сложное разделение строки в js

помогите пожалуйста, есть к примеру текст

'Hello, "a man, who is not a man"!'

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

Т. е. из 'Hello, "a man, who is not a man"!' в ['Hello', '"a man, who is not a man"!'].

P. S. Кавычек может быть более одной пары и могут быть одинарными.

Пробовал написать свой split, но он не универсален и работает только если есть одна пара кавычек:

function split_(str, symbols) {
    let str_ = '';
    let res = [];
    let a = true;
    for (let t = 0; t < str.length; t++) {
        if (symbols.includes(str[t]) === false || t > str.indexOf('"') && t < str.lastIndexOf('"') || t > str.indexOf("'") && t < str.lastIndexOf("'")) {
            str_ += str[t];
        } else {
            res.push(str_.trim());
            str_ = '';
        }
    }
    res.push(str_.trim());
    return res;
}

Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Вы можете использовать

const text = 'Hello, "a man, who is not a man"!';
const matches = text.match(/(?:"[^"]*"|[^,"])+/g).map(x => x.trim());
console.log(matches)

См. пример работы регулярного выражения. Оно находит

  • (?: - начало незахватывающей подмаски:
    • "[^"]*" - символ ", затем ноль и более символов, отличных от ", а потом символ "
    • | - или
    • [^,"] - один символ, отичный от , и "
  • )+ - конец незахватывающей подмаски, повторить 1 и более раз.

Пробельные символы в начале и конце каждого совпадения удаляются с помощью .map(x => x.trim()).

→ Ссылка