正则表达式 \b 和 \B 辨析

代码之外
Article Directory

我想很多初学正则表达式的人都会跟我一样,一开始在接触到 \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 呢,有以下三种:

  1. 字符串的首字符,如果该首字符属于 word character
  2. 字符串的尾字符,如果该尾字符属于 word character
  3. 字符串的中间两个字符,其中一个属于 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 国际许可协议 进行许可。