目标是在空格处拆分字符串,但不拆分引号中的文本数据或将其与相邻文本分开。
输入实际上是一个包含值对列表的字符串。如果值值包含空格,则用引号括起来。我需要一个函数,它返回一个值对元素数组,如下例所示:
示例输入:
' a:0 b:1 moo:" foo bar" C:2'
预期结果:
a:0,b:1,moo:foo bar,c:2 (长度为4的数组)
我已经检查了一大堆其他问题,但没有一个(我发现)似乎应对我的问题。大多数人似乎在引号内的空格处分开,或者他们分开了“moo”:'和' foo bar'分成几个部分。
非常感谢任何帮助, 克雷格
答案 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]
只有当它在引号之外时,才会使用正向前瞻来分隔空格,以确保在空格后有偶数引号。
答案 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] */
这个正则表达式做了什么?
它在空格字符上查找文字匹配,然后使用Positive Lookahead断言下一部分可以匹配:
[\w]+
=在一次和无限次之间匹配任何单词字符[a-zA-Z0-9_]
\:
=匹配:
字符一次(反斜杠转义)。
g
=全局修饰符 - 不会在第一场比赛中返回。
答案 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);