繁体   English   中英

使用正则表达式匹配特定语法

[英]Match a specific syntax with regex

我需要打破文本并以单独的形式获取对象。

object {
    child {

    }
}
object {

}

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

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

但是,当将它应用于上面的文本时,它会全部匹配,我可以理解为什么,但是我不知道我还能做些什么来使它将结果分成单独的部分。

编辑:

更清楚地说,在我提供的文本中,我希望有从'object {'到结束'}'的匹配组,同时包括其中的所有内容。

并使其可视化:匹配组1:

object {
    child {

    }
}

匹配组2:

object {

}

*仅需说明,“ 对象 ”和“ 子代 ”仅是示例,我希望该模式匹配任何名称,并可以选择让子代与父代名称相同

如果我正确理解了您的问题,则需要匹配以下内容:

object {
    child {

    }
}

和这个:

object {

}

作为两个单独的比赛。 在这种情况下,您只需要使量词不贪心即可:

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

? 使*变得非贪婪,因此与其尽可能多地取舍,不如将其取而代之。

您的原件匹配从第一个{到最后一个}所有内容,因为它很贪婪,并且最终会抓住所有内容。

上面的问题是由于嵌套,它错过了第一个对象的最后一个右括号。 您可以像这样在第一层嵌套中解决此问题:

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

通过添加子句{(.|\\n)*?}作为替代,您现在可以正确地匹配嵌套child 但是,当然,问题在于,如果您有另一个嵌套对象,那么它将再次被破坏!

不幸的是,javascript的regex引擎不支持递归(有些支持),因此您可能需要采用其他方法。

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.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM