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 这些编程语言都不支持。