Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript中的RegExp拆分字符串({a},{b})_Javascript_Regex - Fatal编程技术网

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

使用Javascript中的RegExp拆分字符串({a},{b}),javascript,regex,Javascript,Regex,我有一个由API返回的字符串对象。看起来是这样的: {Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{} 我只需要在两边都有}和{的逗号处进行拆分,我希望将它们作为返回结果的一部分保留结果是第一个和最后一个条目有前导括号和尾随括号,当只返回一个元素时,我必须进行额外的检查,以确保我不会向第一个和最后一个(与第一个相同)元素添加任何额外的括号 我希望有一个优雅的RegExp可以在,,被}{包围着进行拆分。您需要使

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

{Apple},{"A tree"},{Three2},{123},{A bracket {},{Two brackets {}},{}
我只需要在两边都有
}
{
的逗号处进行拆分,我希望将它们作为返回结果的一部分保留结果是第一个和最后一个条目有前导括号和尾随括号,当只返回一个元素时,我必须进行额外的检查,以确保我不会向第一个和最后一个(与第一个相同)元素添加任何额外的括号


我希望有一个优雅的RegExp可以在
,被
}{

包围着进行拆分。您需要使用一个积极的向前看来只匹配一个逗号,后面是花括号。我已经测试过,它可以工作:

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]);
}
var apiResponse=“{Apple},{\'A tree\'},{Three2},{123},{A括号{},{Two括号{},{}”;
var split=apiResponse.split(/,(?={)/);
console.log(“拆分长度为”+拆分长度);
对于(i=0;i
(?=\{)
的意思是“后面必须紧跟着一个大括号”


要了解lookaheads,请参阅。

这应该适用于提供的字符串-它不考虑大括号和逗号之间的空格,也不保留引号中的大括号-逗号-大括号模式

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);
您可以使用JSFIDLE进行测试

正则表达式细分:

  • (^ |,)字符串的开头或逗号
  • {一个文字括号“{”
  • (.*)两个括号之间的非贪婪匹配(更多信息 信息)
  • }文字括号“}”
  • (?=,{|$)向前看和不消费(匹配逗号“,{”或结尾) (字符串)如果没有“向前看”,它将消耗掉逗号,并且您只会得到每隔一个项目
更新:更改正则表达式以处理Robin的评论

/(^|,)\{(.*?)\}(?=,|$)/g   to   /(^|,){(.*?)}(?=,{|$)/g

但是,如果出现像
{A Tree},{inside}
这样的输入,就会出现问题。我们也希望如此。祝你好运:)这个符号不一致吗?应该是:{Apple},{A Tree},{Three2},{123},{A方括号{},{Two方括号{},{}你能给出一个所需输出的例子吗?像
{abc},{one}Two}Two}Two}Two}three,{hey},{there}}
结果?所以你不希望在输出中有任何尾随的开括号,对吧?你也相信源代码不会输入类似
{foo{bar},foobar,{hey}}
?顺便说一句,你应该签出@10cls的注释,也许会更新你的问题,你的例子看起来格式不太好(这一个的期望输出会很好)。你是对的,@nhahdh JavaScript不支持lookback,因此我编辑了我的答案,使其不再依赖lookback。非常令人惊讶的是,JavaScript仍然不支持正则表达式的这一古老功能。此解决方案仍然存在与
{“a Tree}相同的问题,{inside“}
,虽然如此。是的,但这是正则表达式的一个自然限制。要从行为不好的字符串(例如该示例)中提取,您必须切换到使用专用的解析器,该解析器可以理解字符串中的标记。匹配字符串仍然在正则表达式的能力范围内(即使在理论意义上)。如果有什么区别的话,括号平衡超出了大多数正则表达式引擎的能力,除了那些允许递归的引擎。如果我们忽略括号平衡,我们仍然需要sticky flag
y
,这在大多数浏览器中是不受支持的,除了Firefox。一些注释:1)您不需要转义
{
如果后面没有
或数字,并且如果它不是
{n,m}
模式的一部分,则不需要转义
。2)这将匹配
{foo{bar},foobar,{hey}
作为
{foo{bar}
,{hey}
/(^|,)\{(.*?)\}(?=,|$)/g   to   /(^|,){(.*?)}(?=,{|$)/g