我正在使用正则表达式 <@(.+?)@>
匹配模式,例如:
<@set:template default.spt @>
它工作正常,但我遇到过需要嵌套模式的情况,例如:
<@set:template <@get:oldtemplate @> @>
我没有获取父对(<@ 和@>),而是得到以下内容:
<@set:template <@get:oldtemplate @>
我不希望它获得子级,我只想要所有嵌套情况下的最外层父级。如何修复我的正则表达式以便它为我执行此操作?我想我可以做到,如果我知道如何为每个 <@
要求有一个@>
在 parent 内部,但我不知道如何强制执行。
最佳答案
您所描述的是“非常规语言”。它不能用正则表达式解析。
好的,如果您愿意限制嵌套级别,从技术上讲,您可以使用正则表达式来做到这一点。但它会很难看。
这里是如何用一些(增加的)最大嵌套深度来解析你的东西,如果你可以在你的标签中加入没有@的条件:
no nesting: <@[^@]+@>
up to 1: <@[^@]+(<@[^@]+@>)?[^@]*@>
up to 2: <@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>
up to 3: <@[^@]+(<@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>)?[^@]*@>
...
如果你不能在你的标签中禁止单独的@,你将不得不替换所有[^@]
的实例。像这样:(?:[^<@]|<[^@]|@[^>])
.
考虑一下,然后考虑扩展您的正则表达式以解析多达 10 层的嵌套。
在这里,我会为你做:
<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>
我希望我的回答表明正则表达式不是解析语言的正确工具。传统的词法分析器(分词器)和解析器组合会做得更好工作,明显更快,并将处理无限嵌套。
关于python - 嵌套时获取外部 "Pair",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16596339/