不以@开头的Preg匹配模式

时间:2017-07-01 11:23:58

标签: php regex

我有以下模式来匹配{{$ name}}块

#{{2}(?:[^{}]*|(?R))+}{2}#

如果我改进上面以忽略不与 @

的模式
#^(?:@){{2}(?:[^{}]*|(?R))+}{2}#

然后匹配

{{$abc}} @{{$name}}

但不是

@{{$name}} {{$abc}}

每行可以有任意数量的块,但是以@开头的块不应该匹配。

3 个答案:

答案 0 :(得分:2)

您可以在原始正则表达式中使用负面的lookbehind:

(?<!@){{(?:[^{}]*|(?R))+}}

RegEx Demo

(?<!@)之前@ {{...}}时,

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,}$/