正则表达式中\ b和\ B之间的区别

时间:2011-07-12 12:28:51

标签: regex

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

  猫把食物散落在整个房间里。

使用正则表达式 - \bcat\b将匹配单词cat,但不匹配cat中的scattered

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

  

请输入九位数ID

     

出现在您的颜色编码密钥上。

在单词\B-\B之间使用正则表达式-匹配color - coded。另一方面,使用\b-\b会与-nine-digit中的pass-key相匹配。

在第一个示例中,我们使用\b分隔cat,第二个使用\B分隔-?在第二个示例中使用\b与之前的操作相反。

请向我解释一下这个区别。

编辑:此外,有人可以用一个新的例子来解释吗?

8 个答案:

答案 0 :(得分:71)

混淆源于你的想法\b匹配空格(可能因为“b”暗示“空白”)。

\b匹配开头或结尾的空字符串\B匹配不在单词开头或结尾的空字符串。这里的关键是“ - ”不是单词的一部分。因此<left>-<right>\b-\b匹配,因为-的任意一侧都有字边界。另一方面,对于<left> - <right>(注意空格),短划线两侧没有单词边界。单词边界是左右一个空格。

另一方面,当搜索\bcat\b单词边界时,行为更直观,并且符合预期的“cat”。

答案 1 :(得分:51)

\b是零宽度字边界。具体做法是:

  

在单词字符(与\ w匹配的任何内容)和非单词字符(由[^ \ w]或\ W匹配的任何内容)之间以及字符串的开头和/或结尾处的位置匹配如果字符串中的第一个和/或最后一个字符是单词字符。

示例:.\bc

中的abc匹配

\B是零宽度非字边界。具体做法是:

  

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

示例:\B.\Bb

中的abc匹配

有关更多优秀的正则表达式信息,请参阅regular-expressions.info

答案 2 :(得分:7)

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

有三种不同的职位符合词边界:

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

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

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

答案 3 :(得分:3)

\b匹配字边界。 \B与非字边界匹配,相当于 [^\b] (?!\b) (感谢@Alan Moore进行更正!)功能 。两者都是零宽度。

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

答案 4 :(得分:2)

\ b用作单词边界

word = "categorical cat"

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

没有\ b

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

与\ b

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

答案 5 :(得分:0)

\B \b,例如否定 \b

pass-key此处-旁边没有单词边界,因此它与您的第一个示例中的\B匹配,在cat旁边有单词边界,因此它匹配\b

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

为负

答案 6 :(得分:0)

设一个字符串:

  

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-X-I-X_X _X-

注意:在这种情况下,下划线(_)不被视为特殊字符。

  1. /\bX\b/g应以特殊字符或空格开头和结尾
  2.    XIX IXI XX X I II IIXX XXII II X - X - X X < / strong> - X -I I- X - X - -I- X - X - 我 - X - X -I- X_X _X-

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

      X IX IXI X X X I II IIXX X XII II X - X - X X - X -I I- X - < strong> X - -I- X - X -I I- X - X - I- X _X _X-

      1. /X\b/g应以特殊字符或空格结尾
      2.    XI X IXI X X X I II IIX X XXII II X - X - X X - X -I I- X - < strong> X - -I- X - X -I I- X - X - I- X_ X _ X -

        1. /\BX\B/g如果开始且以特殊字符或空格结尾
        2.    I X I XX XI II II X XX X II II XX -X X-XI IX -X- -IX - XI IX-XI-X_X _X-

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

            XI X I X IX X XI II II XX X X II II XX -X X-XI IX -X- -IX -XI IX-XI-X_ X _ X -

            1. /X\B/g 以特殊字符或空格结尾
            2.   

              X IX I X I X XXI II II X X XX II II XX -X X-XI IX -X- -IX -XI IX-XI- X _X _X-

              1. /\bX\B/g应该开始且以特殊字符或空格结尾
              2.   

                X IX IXI X XXI II II X X X XII II XX -X X-XI IX -X- -IX -XI IX-XI- X _X _X-

                1. /\BX\b/g 应该开始,应该以特殊字符或空格结尾
                2.    XI X IXI X X XI II IIX X XXII II XX -X X-XI IX -X- -IX -XI IX - XI-X_ X _ X -

答案 7 :(得分:0)

Source©版权所有RexEgg.com

单词边界:\ b *

单词边界\ b匹配位置,其中一侧是单词字符(通常是字母,数字或下划线,但请参见下文,了解各个引擎之间的差异),而另一侧不是单词字符(例如,可能是字符串的开头或空格字符。

因此,正则表达式\ bcat \ b会与黑猫中的cat相匹配,但与catatonic,tomcat或证书中的相匹配。除去其中一个边界,\ bcat将匹配fish鱼中的cat,而cat \ b将匹配tomcat中的cat,但反之则不然。当然,两者都会单独匹配cat。

非单词边界:\ B

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

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

✽当双方都是文字字符时,例如在H和i之间在Hi中!

这似乎不太有用,但是有时\ B就是您想要的。例如,

✽\ Bcat \ B会发现猫完全被单词字符包围,就像在证书中一样,但不能单独出现,也不能位于单词的开头或结尾。

✽cat \ B可以在证书和cat鱼中找到猫,但是在tomcat中都不会找到猫。

✽\ Bcat会在证书和tomcat中都找到猫,但是在cat鱼中或单独都不会找到猫。

✽\ Bcat | cat \ B将在嵌入式情况下找到cat,例如证书,cat鱼或tomcat,但不能单独使用。