将特定语法与正则表达式匹配

时间:2015-01-07 15:10:29

标签: javascript regex

我需要打破此文本并以分离的形式抓取对象。

object {
    child {

    }
}
object {

}

我不是正则表达式专家,但在尝试之后,我得到的最佳模式是这样的:

(.)*{(.|\n)*}/ig

但是当它应用于上述文本时,它会将其全部匹配,我可以看到原因,但我不知道还能做些什么来实际将其分解为单独的部分。

编辑:

更清楚的是,在我提供的文字中,我希望有来自'对象{'关闭'}',同时包括其中的所有内容。

并想象它: 匹配组#1:

object {
    child {

    }
}

匹配组#2:

object {

}

*只是为了澄清,' 对象'和' 孩子'仅仅是示例,我希望模式匹配任何名称,并且可以选择让孩子的名字与父母一样

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你想要匹配:

object {
    child {

    }
}

和此:

object {

}

作为两个单独的比赛。在这种情况下,你只需要让你的量词非贪婪:

(.)*{(.|\n)*?}

?使*非贪婪,所以不要采取尽可能多的措施,而是尽可能少。

您的原始广告符合从第一个{到最后一个}的所有内容,因为它很贪婪,而且当然最终会抓住所有内容。

上面的问题是它因为嵌套而错过了第一个对象的最后一个右括号。您可以在第一级嵌套中修复此问题,如下所示:

(.)*{({(.|\n)*?}|.|\n)*?}

通过添加子句{(.|\n)*?}作为另一种选择,您现在可以正确匹配嵌套的child。但当然,问题是,如果你有另一个嵌套对象,那么它会再被打破!

不幸的是,javascript的正则表达式引擎不支持递归(有些做法),所以你可能需要采取不同的方法。

答案 1 :(得分:2)

object\s*{(?:(?!\bobject\b)[\s\S])*}

试试这个。看看演示。

https://regex101.com/r/sH8aR8/16

var re = /object\s*{(?:(?!\bobject\b)[\s\S])*}/g;
var str = 'object {\n child {\n\n }\n}\nobject {\n\n}';
var m;

while ((m = re.exec(str)) != null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
// View your result using the m-variable.
// eg m[0] etc.
}