Javascript dividido por espacios pero no entre comillas

El objective es dividir una cadena en los espacios, pero no dividir los datos de text entre comillas o separarlos del text adyacente.

La input es efectivamente una cadena que contiene una list de pares de valores. Si el valor del valor contiene un espacio, está entre comillas. Necesito una function que devuelva una matriz de elementos de pares de valores como en el siguiente ejemplo:

Ejemplo de input:

'a: 0 b: 1 moo: "barra foo" c: 2'

Resultado Esperado:

a: 0, b: 1, moo: barra foo, c: 2 (una matriz de longitud 4)

He revisado un montón de otras preguntas, pero ninguna de ellas (he encontrado) parece resolver mi problema. La mayoría parece dividirse en el espacio dentro de las comillas o dividen el 'moo:' y 'foo bar' en partes separadas.

Cualquier ayuda sería muy apreciada, Craig

3 Solutions collect form web for “Javascript dividido por espacios pero no entre comillas”

Podría abordarlo de forma ligeramente diferente y usar una expresión regular para dividir los espacios seguidos de los caracteres de las palabras y dos puntos (en lugar de un espacio que no está en una parte citada ):

var str = 'a:0 b:1 moo:"foo bar" c:2', arr = str.split(/ +(?=[\w]+\:)/g); /* [a:0, b:1, moo:"foo bar", c:2] */ 

Demo jsFiddle

¿Qué está haciendo Regex?
Busca una coincidencia literal en el carácter de espacio, luego usa un Posicionamiento anticipado para afirmar que la siguiente parte puede coincidir:
[\w]+ = coincide con cualquier carácter de palabra [a-zA-Z0-9_] entre uno e ilimitados times.
\: = coincide con el carácter : una vez (barra invertida escapada).
g = modificador global: no regrese en la primera coincidencia.

Demo Regex101 (con explicación)

Puedes usar esta expresión regular para dividir:

 var s = 'a:0 b:1 moo:"foo bar" c:2'; var m = s.split(/ +(?=(?:(?:[^"]*"){2})*[^"]*$)/g); //=> [a:0, b:1, moo:"foo bar", c:2] 

Demostración RegEx

Se divide en espacios solo si está fuera de las comillas usando una anticipación positiva que asegura que haya un número par de citas después de un espacio.

¿Alguna razón especial tiene que ser una expresión regular?

 var str = 'a:0 b:1 moo:"foo bar" c:2'; var parts = []; var currentPart = ""; var isInQuotes= false; for (var i = 0; i < str.length, i++) { var char = str.charAt(i); if (char === " " && !isInQuotes) { parts.push(currentPart); currentPart = ""; } else { currentPart += char; } if (char === '"') { isInQuotes = !isInQuotes; } } if (currentPart) parts.push(currentPart); 
  • Javascript String.fromCharCode ¿Sensibilidad de mayúsculas y minúsculas?
  • ¿Cómo se lee esta expresión regular de JavaScript?
  • convertir el valor de cadena de textareas en una matriz de JavaScript separada por nuevas líneas
  • Reemplaza el espacio con el tablero y haz todas las letras minúsculas con javascript
  • filtrando una serie de cadenas
  • ¿Javascript string.toLowerCase () sigue los estándares Unicode en caso de conversiones?
  • Javascript VERDADERO y "verdadero" ¿por qué alguien usa cadena en lugar de boolean?
  • Guarde o muestre una cadena larga en JavaScript
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.