2

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

例如:

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

将输出this test,而不是this t,尽管中间t不匹配[^\1]。我需要使用/(t)[^\1]*?\1/来匹配this t

此外

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

只匹配this t

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

4

2 回答 2

5

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

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

'/(t)(?:(?!\1).)*\1/'
于 2010-08-25T23:58:56.673 回答
2

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

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

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

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

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

于 2010-08-25T23:57:38.657 回答