Подтвердить что ты не робот

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);

Спасибо!

4b9b3361

Ответ 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' ]