你所描述的是一种“非常规语言”。它不能用正则表达式解析。
好的,如果您愿意限制嵌套级别,从技术上讲,您可以使用正则表达式来做到这一点。但是会很丑。
如果您可以将不包含 @ 的条件放在标签中,以下是如何使用几个(增加)最大嵌套深度来解析您的东西:
no nesting: <@[^@]+@>
up to 1: <@[^@]+(<@[^@]+@>)?[^@]*@>
up to 2: <@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>
up to 3: <@[^@]+(<@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>)?[^@]*@>
...
如果你不能在你的标签中禁止单独的@,你将不得不用这样的[^@]
东西替换每个实例:(?:[^<@]|<[^@]|@[^>])
。
想一想,然后考虑扩展您的正则表达式以解析多达 10 个深度嵌套。
在这里,我会为你做的:
<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>
我希望我的回答表明正则表达式不是解析语言的正确工具。传统的词法分析器(标记器)和解析器组合会做得更好,速度更快,并且可以处理无限嵌套。