我正在尝试使用正则表达式平衡组来匹配嵌套标记,如下所示:
some text ...
{list}
nesting loop content
{list}
{list}
{list}
bala ...
{/list}
{/list}
{/list}
{/list}
end
我的表达:
\{(?<NAME>.+?)\}
[^\{\}]*
(
(
\{(?<NAME2>.+?)\}(?<OPEN>)
[^\{\}]*?
)
(
\{\/\<NAME2>\}(?<-OPEN>)
[^\{\}]*?
)
)*
(?(OPEN)(?!))
\{\/\<NAME>\}
我的问题:
only last 2 level pair can match.
答案 0 :(得分:1)
通常,要匹配嵌套标记,您需要类似于:
的内容(?>
\{(?<Open>\w+)\}
|
\{/(?<-Open>\<Open>)\}
|
(?(Open)[^{}]+)
)*
(?(Open)(?!))
通过这种方式,您可以匹配不同类型的嵌套标记,这看起来就像您要尝试的那样。例如,它将匹配:
{list}
nesting loop content
{world}
{list}
{hello}
bala ...
{/hello}
{/list}
{/world}
{/list}
注意:
(?(Open)[^{}]+)
,因此我们只会匹配标记内的自由文本。你们非常接近。您基本上缺少中间组之间的一个交替:
(
\{(?<NAME2>.+?)\}(?<OPEN>)
[^\{\}]*?
)
| # <---- This
(
\{\/\<NAME2>\}(?<-OPEN>)
[^\{\}]*?
)
但是,您始终使用$NAME2
的最后一个值。 $NAME2
是一个堆栈,但您永远不会从中弹出值,只推送。这会导致错误:它也会匹配此字符串(这可能是错误的):
{list} # Set $Name = "world"
nesting loop content
{world} # Set $Name2 = "world"
{world} # Set $Name2 = "world"
{hello} # Set $Name2 = "hello"
bala ...
{/hello} # Match $Name2 ("hello")
{/hello} # Match $Name2 ("hello")
{/hello} # Match $Name2 ("hello")
{/list} # Match $Name ("list")
另见: