我有以下模式来匹配{{$ name}}块
#{{2}(?:[^{}]*|(?R))+}{2}#
如果我改进上面以忽略不与 @
的模式#^(?:@){{2}(?:[^{}]*|(?R))+}{2}#
然后匹配
{{$abc}} @{{$name}}
但不是
@{{$name}} {{$abc}}
每行可以有任意数量的块,但是以@开头的块不应该匹配。
答案 0 :(得分:2)
您可以在原始正则表达式中使用负面的lookbehind:
(?<!@){{(?:[^{}]*|(?R))+}}
当(?<!@)
之前@
{{...}}
时, Cells
是一种负面的后视断言,可以使比赛失败。
答案 1 :(得分:1)
您需要使用负面的lookbehind (?<!@)
,将其余部分包含在捕获组中,并将(?R)
替换为(?1)
:
(?<!@)({{(?:[^{}]++|(?1))*}})
请参阅regex demo。
如果你只是使用否定前瞻,那么它也会被(?R)
和{{$abc@{{xyz}} }}
递归,就像子串一样不会匹配。
请参阅PHP demo:
$re = '~(?<!@)({{(?:[^{}]++|(?1))*}})~';
$str = '@{{$name}} {{$abc{{xyz}} }} {{$abc@{{xyz}} }}';
preg_match_all($re, $str, $matches);
print_r($matches[0]);
// => Array ( [0] => {{$abc{{xyz}} }} [1] => {{$abc@{{xyz}} }} )
答案 2 :(得分:0)
**Try this one**
you must use [^@] to avoid @
/^[^@][a-zA-Z0-9 ]{2,}$/