我正在使用正则表达式<@(.+?)@>来匹配模式,例如:
<@set:template default.spt @>
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我遇到了我需要嵌套模式的情况,例如:
<@set:template <@get:oldtemplate @> @>
Run Code Online (Sandbox Code Playgroud)
而不是获得父对(<@和@>),我得到以下内容:
<@set:template <@get:oldtemplate @>
Run Code Online (Sandbox Code Playgroud)
我不希望它让孩子一个,我只想在所有嵌套情况下最外面的父.如何修复我的正则表达式,以便它能为我做到这一点?我想如果我知道如何要求父母内部<@有一个@>内容,我就能做到,但我不知道如何强制执行.
你所描述的是一种"非常规语言".它无法使用正则表达式进行解析.
好的,如果您愿意对嵌套级别进行限制,从技术上讲,您可以使用regexp来实现.但它会很难看.
如果你可以在你的标签中加入没有@的条件,下面是如何用一些(增加的)最大嵌套深度来解析你的东西:
no nesting: <@[^@]+@>
up to 1: <@[^@]+(<@[^@]+@>)?[^@]*@>
up to 2: <@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>
up to 3: <@[^@]+(<@[^@]+(<@[^@]+(<@[^@]+@>)?[^@]*@>)?[^@]*@>)?[^@]*@>
...
Run Code Online (Sandbox Code Playgroud)
如果你不能在你的标签中禁止单独的@,你将不得不[^@]用这样的东西替换每个实例:(?:[^<@]|<[^@]|@[^>]).
只要想一想,然后考虑扩展你的正则表达式来解析多达10个深度嵌套.
在这里,我会为你做的:
<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[
^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<
[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@[^>])+(<@(?:[^<@]|<[^@]|@
[^>])+(<@(?:[^<@]|<[^@]|@[^>])+@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>]
)*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@
>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>)?
(?:[^<@]|<[^@]|@[^>])*@>)?(?:[^<@]|<[^@]|@[^>])*@>
Run Code Online (Sandbox Code Playgroud)
我希望我的答案显示的是regexp不是解析语言的正确工具.传统的词法分析器(tokenizer)和解析器组合可以做得更好,速度更快,并且可以处理无限的嵌套.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |