在Javascript中使用RegExp拆分字符串({a},{b})

时间:2014-01-25 19:50:15

标签: javascript regex

我有一个由API返回的字符串对象。它看起来像这样:

{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{}

我只需要在两边都有}{的逗号分开,我希望将它们作为返回结果的一部分。执行split(“},{”)会导致第一个和最后一个条目具有前导和尾随括号,并且当只返回一个元素时,我必须进行额外的检查以确保我不会添加任何额外的括号到第一个和最后一个(与第一个相同)元素。

我希望有一个优雅的RegExp可以在,分割,并被}{包围。

3 个答案:

答案 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/

对其进行测试

正则表达式细分:

  • (^ |,)字符串的开头或逗号
  • {文字括号“{”
  • (。*?)两个括号之间的非贪婪匹配(更多信息 info http://javascript.info/tutorial/greedy-and-lazy
  • } 文字括号“}”
  • (?=,{| $)向前看并且非消费(匹配逗号“,{”或结束 如果没有向前看,它会占用逗号而你最终只能使用其他所有项目。

更新:更改了正则表达式以解决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);