为什么这个正则表达式使用“not”&一个backref,需要一个懒惰的匹配?

时间:2010-08-25 23:54:54

标签: php regex regex-negation

将非^运算符与反向引用结合使用时,为什么需要使用惰性匹配?似乎not应该打破比赛。

例如:

<?php
preg_match('/(t)[^\1]*\1/', 'is this test ok', $matches);
echo $matches[0];
?>

Will output this test,而不是this t,尽管中间t[^\1]不匹配。我需要使用/(t)[^\1]*?\1/ to match this t

此外

preg_match('/t[^t]*t/', 'is this test ok', $matches);

does match only this t

发生了什么,我误解了什么?

2 个答案:

答案 0 :(得分:5)

它不起作用,因为\1这里不是字符类中的反向引用。 \1被解释为ASCII值为1的字符。

您可以使用否定的环视来获得所需的效果:

'/(t)(?:(?!\1).)*\1/'

答案 1 :(得分:2)

您不能在字符类中使用反向引用。 [^\1]表示“1以外的任何字符。”

相反,请使用/(t)(?:(?!\1).)*\1/

(?:...)是非捕获组

(?!...)是一个“负向前瞻”,断言子表达式不匹配

(?!\1).,当\1是单个字符时,表示“任何不匹配的字符\1