RussellJX

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

\b用来设置单词界限。匹配单词(由字母数字或下划线组成的)的开始或结束(匹配开始时,单词之前不能有\w;匹配结束时,单词之后不能有\w)。

写在表达式某个字符或字符串之前,表示此字符或字符串之前不能有\w对应的字符;写在字符后面,表示此字符之后不能有\w对应的字符。

所以\b可以只有一个放在字符前面或后面,也可以有2个(表示字符前后都不能有\w对应的字符)。

 

先看正确的情况

 

图1
注:1.如果\b描述的不是由字母数字或下划线组成的单词,则表达式定义错误,永远不会有字符串与其匹配。如图2:

图2

2.目标字符串中匹配的只是单独的单词,不包括前后的间隔(如空格,\W等),图1中匹配的“Russell”字符两边的空格,

没有计入(测试工具显示没有蓝色背景填充)。
目的:匹配独立的单词或字符串的部分,业务规则是查找所有有单词“Russell”独立出现的地方。如表达式\bRussell\b 则Russell123abc不匹配,

因为Russell后不应该跟字母或数字或下划线,Russell 123abc,Russell@123abc都匹配。


3.特殊情况。自相矛盾的表达式定义。


\b只是用来限定由字母数字或下划线构成的单词,
如果表达式\b之后还有其他表达式,则表达式\b之后的表达式一定不能是\w或者不能是\w中的内容,因为
例子,表达式\bhi\bnihao,意思是单词hi前后不能有\w的内容,并且要求目标字符串有hi,并且hi之后紧跟"nihao"字符。

即这个表达式的定义就是自相矛盾的。
因为:根据\b的定义,\b只是确保下列情况,目标字符串才能匹配:\b前后的字符不能有\w,所以非\w(或者说\W)的字符

在\b前后会匹配上。注意,这里要求要想匹配上一定是非\w的字符,所以正则的潜台词已经说了:匹配上\b的字符身边

一定就是非\w字符了,所以要在\b表达式之后再加上非\w的其他表达式,才有可能让目标字符串匹配上。
所以类似这样的正则永远不会被匹配:\bhi\bnihao 目标字符串hinihao hi nihao hi*nihao hi @#$nihao 。。。
因为\bhi\b要求了hi前后不能有字母数字或下划线的字符,并且hi之后紧接着要是nihao字符串。所以hi前后这

能是空格!@#¥%等特殊字符,而表达式中定义紧接着hi之后的是nihao,所以永远都不会有目标字符串和此正则匹配。

 

办法:在定义正则时,就把这个非\w用正则考虑进去(写进表达式中),修改正则为\bhi\b\W+nihao 则有
hinihao
hi nihao
hi@nihao
hi!@#$ nihao

后三个都匹配

 

posted on 2017-10-19 15:40  RussellJX  阅读(1013)  评论(0编辑  收藏  举报