为什么这个正则表达式使用“not” &反向引用,需要惰性匹配吗?
当将 not ^
运算符与反向引用结合使用时,为什么需要使用惰性匹配?看起来 not
应该打破匹配。
例如:
<?php
preg_match('/(t)[^\1]*\1/', 'is this test ok', $matches);
echo $matches[0];
?>
将输出此测试
,而不是 this t
,尽管中间的 t
与 [^\1]
不匹配。我需要使用 /(t)[^\1]*?\1/
来匹配 this t
。
此外
preg_match('/t[^t]*t/', 'is this test ok', $matches);
仅匹配此t
。
发生了什么事,我误解了什么?
When using the not ^
operator in combination with a back reference, why do I need to use a lazy match? It seems like the not
should break the match.
For example:
<?php
preg_match('/(t)[^\1]*\1/', 'is this test ok', $matches);
echo $matches[0];
?>
Will output this test
, instead of this t
, in spite of the fact that the middle t
does not match [^\1]
. I need to use /(t)[^\1]*?\1/
to match this t
.
Furthermore
preg_match('/t[^t]*t/', 'is this test ok', $matches);
What is going on, and what am I misunderstanding?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
它不起作用,因为这里的
\1
不是字符类内的反向引用。\1
被解释为 ASCII 值为 1 的字符。您可以使用否定环视来获得您想要的效果:
It doesn't work because the
\1
here is not a backreference inside a character class. The\1
is interpreted as the character with ASCII value 1.You could use a negative lookaround instead to get the effect you want:
您不能在字符类中使用反向引用。
[^\1]
表示“除1
之外的任何字符”。相反,请使用
/(t)(?:(?!\1).)*\1/
。(?:...)
是非捕获组(?!...)
是“负向前瞻”,断言子表达式不match(?!\1).
,当\1
是单个字符时,表示“任何不匹配\1
的字符You cannot use backreferences inside character classes.
[^\1]
means "any character other than1
".Instead, use
/(t)(?:(?!\1).)*\1/
.(?:...)
is a non-capturing group(?!...)
is a "negative look-ahead", asserting that the subexpression doesn't match(?!\1).
, when\1
is a single character, means "any character that does not match\1