0

テンプレート エンジンは と の両方{{foo}}{{{bar}}}処理します。これらは異なる処理に対応しています。

現在、ソースはpreg_replaceso:{{\s*(.+?)\s*}}とのように処理されてい{{{\s*(.+?)\s*}}}ます。

問題は、これらの正規表現が重複していることです。たとえば{{\s*(.+?)\s*}}{{{bar}}}.


重要な注意:マーカー{{{{{、は}}}}}実際のコードでユーザーが構成できます。したがって、通常のソリューションなど[^{}]は使用できません。


{{{ }}}現在の解決策は をの前 に置き換えることです{{ }}が、これでは十分に堅牢ではありません。実際、マーカーはユーザー設定可能であり、ユーザーはアプリを壊す値にマーカーを簡単に設定できます。

相互に排他的で、順序に依存しない、より堅牢な正規表現を作成しようとしています。私はすでにアサーション、条件などを使用しようとしましたが、成功しませんでした。どんな助けでも大歓迎です。

ちなみに、コードが長くなりすぎない限り、正規表現の使用は必須ではありません。

4

1 に答える 1

0

いくつかのルックアラウンドを試す必要があるようです。これは、2 つの異なる一致テストを示す私のサンプルです。

$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'

内部テキスト テストを変更して、"} または "{" 以外の文字を探すようにしました。この方法で、内部のすべての文字が返されます。

于 2013-05-01T04:11:12.843 に答える