为什么这个正则表达式使用“not” &反向引用,需要惰性匹配吗?

发布于 2024-09-15 16:37:25 字数 787 浏览 5 评论 0原文

当将 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);

does match only this t.

What is going on, and what am I misunderstanding?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美男兮 2024-09-22 16:37:25

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

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

'/(t)(?:(?!\1).)*\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:

'/(t)(?:(?!\1).)*\1/'
哆兒滾 2024-09-22 16:37:25

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

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

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

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

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

You cannot use backreferences inside character classes. [^\1] means "any character other than 1".

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文