Сложное разделение строки в 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()).