一、 概述
“\b”匹配单词边界,不匹配任何字符。
“\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。
基本上所有的资料里都会说“\b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“\w”所定义的字符所组成的子串。
“\b”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置,也就相当于
(?<!\w)(?=\w)|(?<=\w)(?!\w)
思考:以下写法为什么不等价于“\b”
(?<=\W)(?=\w)|(?<=\w)(?=\W)
注意:严谨的数学逻辑,什么叫\b匹配不全是\w的单词边界。意思就是一定是一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。
零宽与非零宽
非零宽字符:能够匹配字符的(特殊)字符。如:\d会匹配一个数字,\s会匹配空白字符
零宽字符:不匹配字符,只标记位置(具体含义见下文)
字符边界
表达式 | 表示含义 |
---|---|
^ | 与字符串开始的地方匹配 |
$ | 与字符串结束的地方匹配 |
\b | 匹配一个单词边界 |
像这样的匹配位置边界的就叫做0宽字符。也就是\b,^,$都是只是匹配开始或者结束位置的。
举个特殊例子帮大家理解:
$patt= ' sss=sss ';
$patt1='ssss = sss';
$patt2='ssss s= sss';
$patt3='ssdadsa =s sdsd';
正则:'/\b=\b/' '\b=' '=\b';
结果:
patt全部匹配成功
patt1全部不能成功,因为不满足这个逻辑《不全是》
patt2第二个正则匹配成功
patt3第三个正则匹配成功
可以动手试下