嵌套时获取外部“对”

2024-06-16 09:03:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用regex <@(.+?)@>来匹配模式,例如:

<@set:template default.spt @>

它工作得很好,但我遇到过需要嵌套模式的情况,例如:

<@set:template <@get:oldtemplate @> @>

我没有得到父对(<;@和@>;),而是得到以下结果:

<@set:template <@get:oldtemplate @>

我不希望它得到一个子,我只希望在所有嵌套的情况下得到最外层的父。我如何修复我的正则表达式,使它能为我做这件事?我想如果我知道如何要求每个<@在父级内部都有一个@>,我就可以这样做,但我不知道如何强制这样做。你知道吗


Tags: ltgtdefaultget模式情况templateregex
2条回答

你所描述的是一种“非正规语言”。它不能用regexp解析。你知道吗

好的,如果您愿意对嵌套级别进行限制,那么从技术上讲,您可以使用regexp来实现它。但这会很难看。你知道吗

如果您可以在标记中设置不包含@的条件,下面是如何使用一些(增加的)最大嵌套深度来解析您的东西:

no nesting: <@[^@]+@>
up to 1:    <@[^@]+(<@[^@]+@>)?[^@]*@>
up to 2:    <@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>
up to 3:    <@[^@]+(<@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>)?[^@]*@>
...

如果不能禁止标记中的lone@,则必须用如下内容替换[^@]的每个实例:(?:[^<@]|<[^@]|@[^>])。你知道吗

考虑一下这个问题,然后考虑扩展regex以解析多达10个深度的嵌套。你知道吗

在这里,我会为你做:

<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>

我希望我的回答表明,regexp不是解析语言的正确工具。传统的lexer(标记器)和解析器组合将做得更好,速度明显更快,并将处理不确定的嵌套。你知道吗

我不认为用正则表达式可以做到这一点,请看this question的答案,它提出了类似的问题。regex不足以处理任意级别的嵌套,如果只有两个级别的嵌套,那么这应该是可能的,但是regex可能不是最好的工具。你知道吗

相关问题 更多 >