模板引擎同时处理{{foo}}
和{{{bar}}}
,它们对应不同的处理方式。
目前,源代码使用preg_replace
进行处理,如下所示:{{\s*(.+?)\s*}}
和{{{\s*(.+?)\s*}}}
。
问题是,这些正则表达式重叠,例如{{\s*(.+?)\s*}}
匹配{{{bar}}}
。
重要说明:标记{{
,{{{
,}}
,}}}
在实际代码中是用户可配置的。因此,不能使用像[^{}]
这样的常用解决方案。
目前的解决方案是在{{{ }}}
之前替换{{ }}
,但这还不够强大。实际上,标记是用户可配置的,用户可以轻松地将标记设置为打破应用程序的值。
我正在尝试制作互相排斥的robuster正则表达式,而不依赖于顺序。我已经尝试过使用断言,条件等,但没有成功。任何帮助将不胜感激。
顺便说一下,只要代码不会过长,就不必使用正则表达式。
答案 0 :(得分:0)
听起来你需要尝试一些外观。这是我的样本,显示了两个不同的匹配测试
$Matches = @()
$String = 'A template{{{bar}}} engine processes both {{foo}} and {{{bar}}}, they correspond to different treatments.'
write-host "Foo matches"
([regex]'(?<!{){{([^{}]*)}}(?!})').matches($String) | foreach {
write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
} # next match
Write-Host
write-host "Bar matches"
$Matches = @()
([regex]'{{{([^{}]*)}}}').matches($String) | foreach {
write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
} # next match
产量
Foo matches
at 44 = 'foo'
Bar matches
at 13 = 'bar'
at 57 = 'bar'
我修改了你的内部文本测试以查找任何非“}或”{“字符,这样就返回了所有内部字符。