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

时间:2014-09-04 10:55:27

标签: 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'分成几个部分。

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

3 个答案:

答案 0 :(得分: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]

RegEx Demo

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

答案 1 :(得分:3)

您可以略微区别对待并使用Regular Expression分隔空格后面跟单词字符和冒号(而不是不在引用部分的空格):

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

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

Demo Regex101 (with explanation)

答案 2 :(得分:2)

它必须是正则表达式的任何特殊原因吗?

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