我需要打破此文本并以分离的形式抓取对象。
object {
child {
}
}
object {
}
我不是正则表达式专家,但在尝试之后,我得到的最佳模式是这样的:
(.)*{(.|\n)*}/ig
但是当它应用于上述文本时,它会将其全部匹配,我可以看到原因,但我不知道还能做些什么来实际将其分解为单独的部分。
编辑:
更清楚的是,在我提供的文字中,我希望有来自'对象{'关闭'}',同时包括其中的所有内容。
并想象它: 匹配组#1:
object {
child {
}
}
匹配组#2:
object {
}
*只是为了澄清,' 对象'和' 孩子'仅仅是示例,我希望模式匹配任何名称,并且可以选择让孩子的名字与父母一样
答案 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.
}