gpt4 book ai didi

php - 正则表达式单词边界在 PHP 中究竟是如何工作的?

转载 作者:可可西里 更新时间:2023-10-31 22:41:49 24 4
gpt4 key购买 nike

我目前正在编写一个用于匹配内容中特定单词的库。

本质上,它的工作方式是将单词编译成正则表达式,然后通过所述正则表达式运行内容。

我想添加的一个功能是指定要匹配的给定单词是否必须开始和/或结束一个单词。例如,我有单词 cat。我指定它必须以一个词开头,因此 catering匹配,因为 cat 在开头,但是 ducat 不会匹配 因为 cat 不是单词的开头。

我想使用 word boundaries 来做到这一点,但在一些测试中,我发现它并没有像我预期的那样工作。

采取以下措施,

preg_match("/(^|\b)@nimal/i", "something@nimal", $match);
preg_match("/(^|\b)@nimal/i", "something!@nimal", $match);

在上面的陈述中,我希望得到以下结果,

> false
> 1 (@nimal)

但结果却恰恰相反,

> 1 (@nimal)
> false

首先,我预计它会失败,因为该组将吃掉 @,留下 nimal 来匹配 @nimal,显然不是。相反,该组匹配一个空字符串,因此 @nimal 被匹配,这意味着 @ 被认为是单词的一部分。

在第二个中,我希望小组吃掉 ! 留下 @nimal 来匹配其余部分(它应该)。相反,它似乎将 !@ 组合在一起形成了一个词,这通过以下匹配得到证实,

preg_match("/g\b!@\bn/i", "something!@nimal", $match);

知道正则表达式为什么这样做吗?

我只是喜欢一个清楚地记录了如何确定单词边界的页面,我就是找不到一个适合我的生活。

最佳答案

单词边界 \b 匹配从 \w(单词字符)到 \W 非单词字符的变化.如果 @ 之前有一个 \b 是一个 \W 字符,那么您想匹配。因此,要匹配您的 @

之前需要一个单词字符
something@nimal
^^

==> 因为 g@ 之间的单词边界而匹配。

something!@nimal
^^

==> 不匹配,因为 !@ 之间没有单词边界,两个字符都是 \W

关于php - 正则表达式单词边界在 PHP 中究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6531724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com