2013-05-16 46 views
4

当我使用正则表达式<@(.+?)@>匹配的模式,如:获取外“配对”嵌套

<@set:template default.spt @> 

它工作正常,但我碰到的地方,我需要嵌套模式的情况下,这样的因为这样:

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

而不是获取父对(< @和@>)我得到以下几点:

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

我不希望它得到孩子,我只是想在所有嵌套情况下的最外层父母。如何修复我的正则表达式,以便它能为我做到这一点?我想我可以做到这一点,如果我知道如何要求每个<@父母内部有一个@>,但我不知道如何执行该操作。

+0

哪种语言? –

+0

@CasimiretHippolyte Python – FreeSnow

+0

您需要使用'regex'软件包来执行此操作。默认的're'包不能处理任意的嵌套级别。 – nhahtdh

回答

5

你描述的是一种“非正规语言”。它不能用正则表达式解析。

好的,如果你愿意限制嵌套级别,在技术上你可以做一个正则表达式。但它会很丑。

这里是如何与解析你的事情了您的一些标签内(增加)最大嵌套深度,如果你可以把没有的条件@的:

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

如果你不能禁止孤独@在你的代码中,你将不得不用[^@]这样的东西来替换每个实例:(?:[^<@]|<[^@]|@[^>])

试想一下,然后考虑扩展你的正则表达式来解析10个深度嵌套。

在这里,我会为你做它:

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

我希望我的回答所示的是正则表达式不解析语言的工具。传统的词法分析器(标记器)和解析器组合会做得更好,速度更快,并且可以处理无限的嵌套。

+0

可以允许使用'@'和'>',而不用'(?:(?!@>)消耗结束标记。得到最终结果。 – nhahtdh

1

我不认为你可以用正则表达式来做到这一点,请参阅this question的答案,其中提供了类似的东西。正则表达式不足以处理任意级别的嵌套,如果你只有两层嵌套,那么它应该是可能的,但也许正则表达式不是工作的最佳工具。