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); 
  • ¿Cómo eliminar todos los saltos de línea de una cadena?
  • Determinar si una cadena es un palíndromo
  • ¿Cómo contar la ocurrencia de cadena en una cadena?
  • Dividido por un personaje en JavaScript pero no contiguo
  • Eficiente reemploop de cadenas de Javascript
  • Reemplaza el espacio con el tablero y haz todas las letras minúsculas con javascript
  • Eliminar barras diagonales de cadenas en JavaScript
  • Obtener ID de video de YouTube desde la URL con jQuery
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.