我有一个由API返回的字符串对象。它看起来像这样:
{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{}
我只需要在两边都有}
和{
的逗号分开,我希望将它们作为返回结果的一部分。执行split(“},{”)会导致第一个和最后一个条目具有前导和尾随括号,并且当只返回一个元素时,我必须进行额外的检查以确保我不会添加任何额外的括号到第一个和最后一个(与第一个相同)元素。
我希望有一个优雅的RegExp可以在,
分割,并被}{
包围。
答案 0 :(得分:1)
您需要使用正向前瞻来匹配逗号,后面跟着花括号。我已经测试了这个并且它有效:
var apiResponse = "{Apple},{\"A tree\"},{Three2},{123},{A bracket {},{Two brackets {}},{}";
var split = apiResponse.split(/,(?={)/);
console.log("Split length is "+split.length);
for(i = 0; i < split.length; ++i) {
console.log("split["+i+"] is: "+split[i]);
}
(?=\{)
表示“必须紧跟一个开口大括号”。
要了解前瞻,请参阅this regex tutorial。
答案 1 :(得分:1)
var _data = '{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{}';
var _items = [];
var re = /(^|,){(.*?)}(?=,{|$)/g;
var m;
while ((m = re.exec(_data)) !== null){
_items.push(m[2]);
}
您可以使用jsFiddle http://jsfiddle.net/wao20/SgFx7/24/
对其进行测试正则表达式细分:
更新:更改了正则表达式以解决Robin的评论。
/(^|,)\{(.*?)\}(?=,|$)/g to /(^|,){(.*?)}(?=,{|$)/g
答案 2 :(得分:0)
这应该适用于提供的字符串 - 它不考虑大括号和逗号之间的空格,也不会在引号内保留大括号逗号括号模式。
var str = '{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{}';
var parts = [];
var nextIndex = function(str) {
return (str.search(/},{/) > -1) ? str.search(/},{/) + 1 : null;
};
while (nextIndex(str)) {
parts.push(str.slice(0, nextIndex(str)));
str = str.slice(nextIndex(str) + 1);
}
parts.push(str); // Final piece
console.log(parts);