Javascript разделяет строку по пробелам, но игнорирует пробел в кавычках (обратите внимание, чтобы не разделить двоеточие)
Мне нужна помощь, разделяющая строку в javascript по пространству (""), игнорируя пробел внутри выражения кавычек.
У меня есть эта строка:
var str = 'Time:"Last 7 Days" Time:"Last 30 Days"';
Я бы ожидал, что моя строка будет разделена на 2:
['Time:"Last 7 Days"', 'Time:"Last 30 Days"']
но мой код разбивается на 4:
['Time:', '"Last 7 Days"', 'Time:', '"Last 30 Days"']
это мой код:
str.match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
Спасибо!
Ответы
Ответ 1
s = 'Time:"Last 7 Days" Time:"Last 30 Days"'
s.match(/(?:[^\s"]+|"[^"]*")+/g)
// -> ['Time:"Last 7 Days"', 'Time:"Last 30 Days"']
Разъяснения:
(?: # non-capturing group
[^\s"]+ # anything that not a space or a double-quote
| # or…
" # opening double-quote
[^"]* # …followed by zero or more chacacters that are not a double-quote
" # …closing double-quote
)+ # each match is one or more of the things described in the group
Оказывается, чтобы исправить исходное выражение, вам просто нужно добавить +
в группу:
str.match(/(".*?"|[^"\s]+)+(?=\s*|\s*$)/g)
# ^ here.
Ответ 2
Решение ES6, поддерживающее:
- Разделить пространство, за исключением внутренних кавычек
- Удаление котировок, но не для обратных косов с экранированными кавычками
- Исключенная цитата станет цитатой
код:
str.match(/\\?.|^$/g).reduce((p, c) => {
if(c === '"'){
p.quote ^= 1;
}else if(!p.quote && c === ' '){
p.a.push('');
}else{
p.a[p.a.length-1] += c.replace(/\\(.)/,"$1");
}
return p;
}, {a: ['']}).a
Вывод:
[ 'Time:Last 7 Days', 'Time:Last 30 Days' ]