Javascript divisé par des espaces mais pas ceux en guillemets

Le but est de diviser une chaîne dans les espaces, mais pas de diviser les données de texte en guillemets ou de les séparer du texte adjacent.

L'entrée est effectivement une chaîne qui contient une liste de paires de valeurs. Si la valeur de valeur contient un espace, elle est placée entre guillemets. J'ai besoin d'une fonction qui renvoie un tableau d'éléments de paire de valeurs selon l'exemple ci-dessous:

Exemple d'entrée:

'A: 0 b: 1 moo: "foo bar" c: 2'

Résultat attendu:

A: 0, b: 1, moo: foo bar, c: 2 (un rang de longueur 4)

J'ai vérifié beaucoup d'autres questions, mais aucune d'entre elles (je l'ai trouvé) semble faire face à mon problème. La plupart semblent se diviser à l'espace dans les guillemets ou ils divisent le 'moo:' et 'foo bar' en parties séparées.

Toute aide serait grandement appréciée, Craig

Vous pouvez l'aborder légèrement différemment et utiliser une expression régulière pour diviser où les espaces sont suivis par des mots et des deux points (plutôt qu'un espace qui n'est pas dans une partie citée ):

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-ce que Regex fait?
Il recherche une correspondance littérale sur le caractère de l'espace, puis utilise un lookahead positif pour affirmer que la partie suivante peut être adaptée:
[\w]+ = associe n'importe quel caractère de mot [a-zA-Z0-9_] entre un et des heures illimitées.
\: = Correspond le : caractère une fois (la barre oblique invariable s'est échappée).
g = modificateur global – ne retourne pas lors de la première correspondance.

Demo Regex101 (avec explication)

Vous pouvez utiliser cette regex pour diviser:

 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] 

Démo RegEx

Il se divise sur les espaces uniquement s'il est en dehors des citations en utilisant un lookahead positif qui s'assure qu'il y ait un nombre pair de citations après un espace.

Une raison particulière pour laquelle il doit être un regexp?

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