B 和 B 在正则表达式中的区别

我正在读一本关于正则表达式的书,我偶然发现了 \b的这个例子:

猫把食物撒得房间里到处都是。

使用 regex-\bcat\b将匹配单词 cat,但不匹配 scattered中的 cat

对于 \B,作者使用了以下例子:

请输入九位数的身份证号码

出现在你的彩色通行证上。

使用正则表达式 \B-\B匹配单词 color - coded之间的 -。另一方面,使用 \b-\bnine-digitpass-key中的 -相匹配。

为什么在第一个例子中我们使用 \b来分离 cat,而在第二个例子中我们使用 \B来分离 -?在第二个示例中使用 \b与前面的操作相反。

请给我解释一下其中的区别。

编辑: 还有,谁能用一个新的例子来解释一下?

186971 次浏览

\b是一个零宽度的单词边界。具体来说:

匹配单词字符(任何与 w 匹配的字符)和非单词字符(任何与[ ^ w ]或 W 匹配的字符)之间的位置,以及如果字符串中的第一个和/或最后一个字符是单词字符,则匹配字符串的开始和/或结束。

示例: .\b匹配 abc中的 c

\B是一个零宽度的非单词边界。具体来说:

匹配两个单词字符之间的位置(即 w w 之间的位置)以及两个非单词字符之间的位置(即 W W)。

示例: \B.\B匹配 abc中的 b

有关更多正则表达式信息,请参见 Regular-expressions.info

例如 没有

pass-key-旁边没有单词边界,所以它匹配 \B在第一个例子中,cat 旁边有单词边界,所以它匹配 \b

类似的规则也适用于其他人。 \W是负的 \w \UPPER CASE是负的 \LOWER CASE

\b匹配一个单词边界。 \B匹配非单词边界,相当于 [^\b](?!\b) 谢谢艾伦 · 摩尔(Alan Moore)的纠正。两者都是 零宽度。

有关详细信息,请参阅 http://www.regular-expressions.info/wordboundaries.html。该站点对于许多基本的正则表达式问题非常有用。

元字符 b 是像插入符号和美元符号一样的锚。它在一个称为“词边界”的位置上匹配。这场比赛是零长度。

有三种不同的位置符合词语界限:

  • 如果第一个字符是单词字符,则在字符串中的第一个字符之前。
  • 在字符串的最后一个字符之后,如果最后一个字符是一个单词字符。
  • 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

B 是 b 的否定形式。在 B 不匹配的每个位置,B 都匹配。实际上,B 匹配两个单词字符之间的任何位置以及两个非单词字符之间的任何位置。

资料来源: http://www.regular-expressions.info/wordboundaries.html

这种困惑源于你认为 \b与空格匹配(可能是因为“ b”表示“空格”)。

\b匹配 单词的开头或结尾处的空字符串。\B匹配不在单词开头或结尾处的空字符串。这里的关键是“-”不是单词的一部分。所以 <left>-<right>匹配 \b-\b,因为在 -的两边都有单词边界。另一方面,对于 <left> - <right>(注意空格) ,破折号的两边都没有单词边界。“边界”这个词是再向左和向右的一个空格。

另一方面,当搜索 \bcat\b字边界行为更直观,它匹配“猫”的预期。

再举一个不同的例子:

考虑一下这是要搜索的字符串和模式是“ cat”:

text = "catmania thiscat thiscatmaina";

现在是定义,

“ b” 查找/匹配每个单词开头或结尾的模式。

“ B” 不能找到/匹配每个单词开头或结尾的模式。

不同个案:

案例1: 在每个单词的开头

result = text.replace(/\bcat/g, "ct");

现在,结果是“ ctmania this cat this catmaina”

案例2: 在每个单词的末尾

result = text.replace(/cat\b/g, "ct");

现在,结果是“连环杀人狂这个连环杀人狂”

案例3: 一开始没有

result = text.replace(/\Bcat/g, "ct");

现在,结果是“ Catmania thisctmaina”

案例4: 最终没有

result = text.replace(/cat\B/g, "ct");

现在,结果是“ ctmania this cat thistmaina”

案例5: 既不开始也不结束

result = text.replace(/\Bcat\B/g, "ct");

现在,结果就是“这只猫疯了”

希望这对你有帮助:)

取一个字符串,如:

XIX IXI XX X I II IIXX XXII I-I X-X-X X-X-X-I I-X-X-X-I I-X-X-I-X-X-X-X _ X-

注意: Underscore (_)在本例中不被视为特殊字符。

  1. /\bX\b/g应以特殊字符或空格开始和结束

XIX IXI XX X I II IIXX XXII I-I X-X-X-X-I-X-X-I-X-X-I-X-X-I-X-X-I-X _ X -


  1. /\bX/g应以特殊字符或空白开头

X IX IXI XX X II IIXX XX0-I X-X-X-I-X-I-X-I-X-X-I-X-I-X-I-X-X-I-X-I-X-I-X-X-I-X-X-I-X-X _ X-


  1. /X\b/g应以特殊字符或空白结束

XIX IXI XX X I IIXX XXII I-I X-X-X-X-I-X-I-X-I-X-I-X-X-I-X _ X-


  1. /\BX\B/g < br > 没有是否应该以特殊字符或空格开始和结束

XIX IXI XX X I II IIXX XXII I-I X-X-X X-X-I I-X-X-I-X-X-I I-X-I-X-X-X _ X-


  1. /\BX/g应该以特殊字符或空白开头

XIX IX XI II IIXX XX II I-I X-X-X-X-X-I I-X-X-I-X-X-I I-X-X-I-X-X-X _ X _ X-


  1. /X\B/g应该以特殊字符或空白结束

X IX IXI XX X I II IIXX XXII I-I X-X-X X-X-I I-X-X-I-X-I I-X-X-I-X-I-X-I-X _ X _ X-


  1. /\bX\B/g应该以一个特殊字符或空白开始,没有以一个特殊字符或空白结束

X IX IXI XX X I II IIXX XXII I-I X-X-X X-I I-X-X-I-X-X-I I-X-X-I-X-I-I-X _ X-


  1. /\BX\b/g应该以一个特殊的字符或空格开始和结束

XIX XXII I-I X-X-X X-X-I I-X-X-I-X-X-I-I-X-I-X-I-X-X _ X _ X -

来源 版权所有 RexEgg.com

单词边界: b *

单词边界 b 匹配的位置中,一边是单词字符(通常是字母、数字或下划线) ,另一边不是单词字符(例如,它可能是字符串或空格字符的开头)。

因此,正则表达式 bcat b 将匹配 cat 在黑猫中的位置,但不会匹配紧张性精神分裂症、 tomcat 或证书中的位置。除去其中一个边界,bcat 将在鲶鱼中匹配 cat,cat b 将在 tomcat 中匹配 cat,但反之则不然。当然,两者都可以单独匹配猫。

没有一个字的界限: B

B 匹配 b 不匹配的所有位置。因此,它匹配:

如果两边都不是单词字符,例如在字符串 $= (@-% + +)中的任何位置(包括字符串的开头和结尾)

当两边都是单词字符时,例如在 Hi 中 H 和 i 之间!

这可能看起来没什么用,但是有时候 B 正是你想要的。例如,

Bcat B 将发现 cat 完全被单词字符包围,如在证书中,但既不是单独的,也不是在单词的开头或结尾。

猫 B 在证书和鲶鱼中都能找到猫,但是在公猫和它自己身上都找不到猫。

在证书和公猫中都能找到猫,但是在鲶鱼中不能找到猫,也不能单独找到猫。

Cat B 会在嵌入的情况下找到 cat,例如在证书、鲶鱼或 Tomcat 中,但不会自己找到 cat。

B 用作单词边界

word = "categorical cat"

在上面的单词中找到所有的“猫”

没有 B

re.findall(r'cat',word)
['cat', 'cat']

和 B

re.findall(r'\bcat\b',word)
['cat']

正如 https://www.regular-expressions.info/wordboundaries.html中提到的:

有三个不同的位置符合 \b的单词边界:

  1. 在字符串的第一个字符之前,如果第一个字符是单词字符 \w
  2. 在字符串的最后一个字符之后,如果最后一个字符是单词字符 \w
  3. 在字符串中的两个字符之间,其中一个是字符 \w,另一个不是字符 \W

为了更好地理解 \b,我想通过使用箭头在字符串上放置单词边界来考虑字符串。

单击此链接可以看到字符串的数组可视化——“ THE CAT SCATTERED”。

单击此链接可以看到字符串的数组可视化-“ THE NINE-DIGIT COLOR-CODED PASS-KEY”

在字符串 THE CAT SCATTERED

  • 按照上面提到的 condition 1分配 index 0的单词边界。

  • 按照 condition 2分配 index 16处的单词边界。

  • indices 2, 4, 6 and 8处的单词边界是按照 condition 3指定的。

在字符串 THE NINE-DIGIT COLOR - CODED PASS-KEY

  • index 0处的单词边界由以下 condition 1指定。

  • 所有剩余的单词边界都是按照 condition 3分配的。注意,由于字符串以‘ .’字符结束(这不是一个单词字符 \w) ,因此不应用 condition 2

使用以下条件,可以对非字边界 \B进行类似的数组可视化:

(编辑: 检查 @ Ganesh MS’s答案为相同的问题)

\B匹配 \b不匹配的所有位置,即:

  1. 当两边都不是单词字符时(即两边都是 \W时) ,例如在字符串 $= (@-% + +)中的任何位置(包括字符串的开头和结尾)
  2. 当两边都是单词字符 \w时,例如在 Hi 中 H 和 i 之间!