Javascript按空格分隔,但不是用引号分隔

Cro*_*rog 4 javascript regex string split

目标是在空格处拆分字符串,但不拆分引号中的文本数据或将其与相邻文本分开.

输入实际上是一个包含值对列表的字符串.如果值值包含空格,则用引号括起来.我需要一个函数,它返回一个值对元素数组,如下例所示:

示例输入:

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

预期结果:

a:0,b:1,moo:foo bar,c:2(长度为4的数组)

我已经检查过其他一些问题,但没有一个(我发现)似乎能解决我的问题.大多数似乎在引号内的空格处分开,或者将"moo:"和"foo bar"分成不同的部分.

克雷格,非常感谢任何帮助

anu*_*ava 8

您可以使用此正则表达式进行拆分:

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]
Run Code Online (Sandbox Code Playgroud)

RegEx演示

只有当它在引号之外时才会使用正向前瞻分隔空格,以确保在空格后有偶数引号.

  • +1,这太棒了,我真的想要更彻底的解释:) (2认同)

Moo*_*oob 4

您可以稍微不同地处理它,并使用正则表达式来分割空格后跟单词字符和冒号(而不是不在引用部分中的空格):

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] */
Run Code Online (Sandbox Code Playgroud)

演示 jsFiddle

这个正则表达式在做什么?
它在空格字符上查找文字匹配,然后使用正向前瞻来断言下一部分可以匹配:
[\w]+= 匹配任意单词字符 [a-zA-Z0-9_] 一次和无限次。
\:= 匹配:字符一次(反斜杠转义)。
g= 全局修饰符 - 第一次匹配时不返回。

演示 Regex101(带解释)