我想很多初学正则表达式的人都会跟我一样,一开始在接触到 \b 的时候,由于一些例子错误引导,可能会认为跟正则表达式的另一个元字符 ^ 是一样的,都是匹配单词开头的,其实不然,不信,我们来举个例子。
如果正文的内容是这样的:
-simowce go: Hello, steve jobs
-steve jobs: Hey, simowce. Hope you can change the world
接下来我们要匹配句子开头的 -simowce
,我们使用 grep 来进行匹配,输入如下的命令:
grep "\b-simowce"
结果是什么?你可能会很惊奇,什么都没有输出!这说明了 \b 和 ^ 是有根本性的区别的,下面我来详解一下:
\b 里面 b 代表着 word boundry ,那么什么可以被成为 word boundry
呢,有以下三种:
- 字符串的首字符,如果该首字符属于
word character
- 字符串的尾字符,如果该尾字符属于
word character
- 字符串的中间两个字符,其中一个属于
word character
,另一个不属于word character
说明一下,一般而言 word character
就相当于 \w
,即 [0-9A-Za-z_] ,不过似乎有一些还有拓展。
还有,\b
匹配的是位置,所以它是不占用长度的。这一点很重要!
有了这一些说明了之后,我们就 可以解释上面的奇异现象了!
关键点就在于,**-** 不属于 word character
所以即使 - 是字符串的首字符,\b 还是会把它跳掉。
至于 \B,就是与 \b 相反,即 \b 不能匹配的地方 \B 就能匹配。
我们来看一个例子,正文的内容如下:
Please enter the nine-digit id as it
appears on your color - code pass-key
然后我们的命令是:
grep "\B-\B"
你可以猜一下结果是什么,没错,只有color - code 中的那个 - 匹配到了。
原因就是,当正则表达式引擎匹配到 color - code 的那个 - 的时候,此时 - 前面是一个空格,属于 word character ,而 - 不属于 word character ,所以符合了 \B 的要求,又因为 \B 不占用长度,所以此时是用 color - code 去匹配 \B 后面的 - 的 ,然后后面的那一个 \B 一样的道理,就不赘述了。
至此,说明完毕!
EOF
Author: simowce
Permalink: https://blog.simowce.com/how-to-understand-b-and-b-in-regular-expression/
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。