正则表达式单词边界在PHP中的工作原理是什么?

Ste*_*ose 10 php regex

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

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

我想要添加的功能是指定要匹配的给定单词是否必须开始和/或结束单词.例如,我有这个词cat.我指定它必须开始一个字,因此catering匹配cat是在开始,但ducat 不能匹配cat不启动的话.

我想用字边界做这个,但在一些测试中我发现它不能像我期望的那样工作.

采取以下,

preg_match("/(^|\b)@nimal/i", "something@nimal", $match);
preg_match("/(^|\b)@nimal/i", "something!@nimal", $match);
Run Code Online (Sandbox Code Playgroud)

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

> false
> 1 (@nimal)
Run Code Online (Sandbox Code Playgroud)

但结果恰恰相反,

> 1 (@nimal)
> false
Run Code Online (Sandbox Code Playgroud)

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

在第二,我希望小组吃!剩下@nimal来匹配其余的(应该).相反,它似乎将这些!@组合在一起形成一个单词,这可以通过以下匹配来确认,

preg_match("/g\b!@\bn/i", "something!@nimal", $match);
Run Code Online (Sandbox Code Playgroud)

任何想法为什么正则表达式这样做?

我只是喜欢一个清楚记录字边界是如何确定的页面,我找不到一个用于生活的人.

ste*_*ema 19

单词边界\b匹配从\w(单词字符)到\W非单词字符的变化.如果\b@\W角色之前有一个,你想要匹配.所以为了匹配,你需要一个单词字符@

something@nimal
        ^^
Run Code Online (Sandbox Code Playgroud)

==>因为之间的字边界的匹配g@.

something!@nimal
         ^^ 
Run Code Online (Sandbox Code Playgroud)

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