跳到主要内容

6.2 单词边界

第一种边界,也是最常用的边界,是由限定符 \b (boundary)指定的单词边界。顾名思义, \b 用来匹配单词的开始或结尾。

6.2.1 匹配单词边界

为了演示 \b 的用法,让我们回到刚才的例子再做一次尝试,但这次我们用上单词边界。

\bhefang\b
大家好,我是何方(hefang)。欢迎来到正则表达式系列教程。更多内容请访问的何方的个人小站https://iamhefang.cn
xxx@xxx.xxx
在工具中查看
大家好,我是何方(xxx@xxx.xxx)。欢迎来到正则表达式系列教程。更多内容请访问的何方的个人小站https://iamhefang.cn

在源文本里面,单词"hefang"的前后是括号"()",而这将与模式 \bhefang\b 相匹配(英文括号是用来分割单词的字符之一)。网址 "https://iamhefang.cn" 中的"hefang" 不能与这个模式匹配,因为它前面是"m","m"不能与 \b 相匹配。

注意

\b 到底匹配什么东西呢?正则表达式引擎不懂人类的语言,也不知道什么是单词边界。简单地说, \b 匹配的是一个这样的位置,这个位置位于一个能够构成单词的字符(字母、数字和下划线,也就是与 \w 与匹配的字符)和一个不能用来构成单词的字符(也就是与 \W 相匹配的字符)之间。这也就是说使用 \b 是无法匹配中文(或其他非英文)边界的。

6.2.2 匹配单词左边界

这时要特别注意的是,如果你想要匹配一个完整的单词,就必须在你想要匹配的文本的前后都加上 \b 限定符。请看下面这个例子:

\bcap
在工具中查看
The captian wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.

模式 \bcap 将匹配以字符序列"cap"开头的任何一个单词。这里总共找到了 4 个匹配,其他 3 个是以字符序列"cap"开头的其他单词而不是"cap"本身。

6.2.3 匹配单词右边界

下面这个例子还是刚才那段文字,但这次的正则表达式只有一个后缀的 \b 限定符:

cap\b
在工具中查看
The captian wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.

模式 cap\b 将匹配以字符序列"cap"结尾的任何一个单词。这里总共找到了 2 个匹配,其他一个是以字符序列"cap"结尾的其他单词而不是"cap"本身。

如果你只想匹配"cap"本身,就必须使用 \bcap\b 做为模式,它才是你需要的正确答案。

注意

\b 匹配且只匹配一个位置,不匹配任何字符。用 \bcap\b 匹配到的字符串长度是 3 (c、a、t),而不是 5;

6.2.4 不匹配单词边界

如果你想表明不匹配一个单词边界,请使用 \B 。在下面的例子里,我们将使用 \B 来查找其前后都有多余空格的连字符:

\B-\B
在工具中查看
Please enter the nine-digit id as it appears on your colors - coded pass-key.

\B-\B 匹配一个前后都不是单词边界的连字符。"nine-digit"和"pass-key"中的连字符不会与之匹配,但"colors - coded"中的连字符可以与之匹配。

注意

除了用 \b 来匹配单词边界,有些正则表达式引擎还支持另外两个元字符; \< 匹配单词的开头, \> 匹配单词的结尾。不过,虽然这两种字符可以提供粒度更细的控制,但支持它们的正则表达式引擎却并不多见。 经过测试,egrep 命令是支持的,但 Javascript、php、Python 这些编程语言都不支持。

该内容基于 《正则表达式必知必会》 二度创作
转载请遵守原作者相关协议并注明本页地址
https://iamhefang.cn/tutorials/正则表达式/第六章-位置匹配/6.2-单词边界