将非^
运算符与反向引用结合使用时,为什么需要使用惰性匹配?似乎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);
发生了什么,我误解了什么?
答案 0 :(得分:5)
它不起作用,因为\1
这里不是字符类中的反向引用。 \1
被解释为ASCII值为1的字符。
您可以使用否定的环视来获得所需的效果:
'/(t)(?:(?!\1).)*\1/'
答案 1 :(得分:2)
您不能在字符类中使用反向引用。 [^\1]
表示“1
以外的任何字符。”
相反,请使用/(t)(?:(?!\1).)*\1/
。
(?:...)
是非捕获组
(?!...)
是一个“负向前瞻”,断言子表达式不匹配
(?!\1).
,当\1
是单个字符时,表示“任何不匹配的字符\1