<p>你所描述的是一种“非正规语言”。它不能用regexp解析。你知道吗</p>
<p>好的,如果您愿意对嵌套级别进行限制,那么从技术上讲,您可以使用regexp来实现它。但这会很难看。你知道吗</p>
<p>如果您可以在标记中设置不包含@的条件,下面是如何使用一些(增加的)最大嵌套深度来解析您的东西:</p>
<pre><code>no nesting: <@[^@]+@>
up to 1: <@[^@]+(<@[^@]+@>)?[^@]*@>
up to 2: <@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>
up to 3: <@[^@]+(<@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>)?[^@]*@>
...
</code></pre>
<p>如果不能禁止标记中的lone@,则必须用如下内容替换<code>[^@]</code>的每个实例:<code>(?:[^<@]|<[^@]|@[^>])</code>。你知道吗</p>
<p>考虑一下这个问题,然后考虑扩展regex以解析多达10个深度的嵌套。你知道吗</p>
<p>在这里,我会为你做:</p>
<pre><code><@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>
</code></pre>
<p>我希望我的回答表明,<strong><em>regexp不是解析语言的正确工具。</em></strong>传统的lexer(标记器)和解析器组合将做得更好,速度明显更快,并将处理不确定的嵌套。你知道吗</p>