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

sti*_*edo 92 regex

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

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

使用正则表达式- \bcat\b将匹配单词cat而不是catscattered.

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

请输入九位数的ID

出现在颜色编码的密钥上.

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

为什么我们用第一个例子\b来分离cat和在第二个用途\B中分开-?使用\b在第二个例子中做的是什么前面却反其道而行之.

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

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

and*_*ski 75

混乱源于你的思维\b匹配空间(可能是因为"b"表示"空白").

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

另一方面,当搜索\bcat\b单词边界时,行为更直观,并且按预期匹配"cat".

  • 是的,我确实将 \b 与空格混淆了。不过,我还是觉得有些迷茫。我可以再问你一个例子吗? (2认同)
  • 关键是`-`不被视为单词的一部分.同样,`!`不是单词的一部分.所以`\ b!\ b`匹配"uunet!iamold",但不是"哇!你是." 你可以在http://regexpal.com上试试这些东西. (2认同)
  • 只需补充一下,正则表达式中的作品由字母(a-z 和 A-Z)、数字和“_”[下划线]组成。其他一切都是非言语。 (2认同)

Boh*_*ian 56

\b是一个零宽度的单词边界.特别:

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

例如:.\b比赛cabc

\B是一个零宽度的非字边界.特别:

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

例如:\B.\B比赛babc

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

  • +1因为零宽度是定义的重要部分.如果它不是零宽度,那么它也会在模式的匹配部分中获取那些单词/非单词字符. (6认同)
  • 换句话说,\ B匹配\ W和\ W之间或\ w和\ w之间的点,但不匹配\ W和\ w之间的点. (4认同)

小智 27

用不同的例子:

考虑这是要搜索的字符串和模式是'cat':

text = "catmania thiscat thiscatmaina";

现在定义,

'\ b'查找/匹配每个单词开头或结尾的模式.

'\ B'找不到/匹配每个单词开头或结尾的模式.

不同案例:

案例1:每个单词的开头

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

现在,结果是"ctmania thiscat thiscatmaina"

案例2:每个单词的结尾

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

现在,结果是"catmania thisct thiscatmaina"

案例3:不是在开始

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

现在,结果是"catmania thisct thisctmaina"

案例4:不是最后的

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

现在,结果是"ctmania thiscat thisctmaina"

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

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

现在,结果是"catmania thiscat thisctmaina"

希望这可以帮助 :)

  • 如果我错了,请纠正我,但是,当使用 \bcat\b 时,如果我们的字符串是,例如:“catcat is my cat”=&gt; 第一个单词 (catcat) 将适用于这种情况。不?。 (3认同)
  • @Kosem 这是一个很好的问题,让我更好地研究 `\b` 。我后来明白的是,第一个单词不匹配的原因是,对于“\bcat\b”,你说的是“cat”必须被单词边界包围。`catcat` 以单词边界开头,找到第一个内部 `cat` [我们仍然尊重正则表达式],但尾部 `\b` 强制要求在 `catcat` 中的第一个 `t` 之后应该有另一个单词边界,但情况并非如此,因为“catcat”中的第二个“c”是另一个单词字符[=单词继续]。跳过“catcat”的第二个“cat”的类似原因 (3认同)

Dan*_*rth 7

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

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

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

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

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


Gan*_*M S 7

来源\xc2\xa9 版权所有 RexEgg.com

\n\n

字边界:\\b*

\n\n

单词边界 \\b 匹配一侧是单词字符(通常是字母、数字或下划线\xe2\x80\x94,但请参阅下面的不同引擎的变化)而另一侧不是单词字符(例如,可能是字符串的开头或空格字符)。

\n\n

因此,正则表达式 \\bcat\\b 会匹配黑猫中的 cat,但不会匹配紧张症、tomcat 或证书中的猫。删除其中一个边界, \\bcat 将匹配 catfish 中的 cat,而 cat\\b 将匹配 tomcat 中的 cat,但反之则不然。当然,两者都可以单独匹配 cat。

\n\n

非单词边界:\\B

\n\n

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

\n\n

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

\n\n

\xe2\x9c\xbd 当两边都是单词字符时,例如 Hi! 中的 H 和 i 之间

\n\n

这可能看起来不太有用,但有时 \\B 正是您想要的。例如,

\n\n

\xe2\x9c\xbd \\Bcat\\B 将发现 cat 完全被单词字符包围,如证书中所示,但既不单独存在,也不位于单词的开头或结尾。

\n\n

\xe2\x9c\xbd cat\\B 会在证书和 catfish 中找到 cat,但不会在 tomcat 中或单独找到 cat。

\n\n

\xe2\x9c\xbd \\Bcat 会在证书和 tomcat 中找到 cat,但不会在 catfish 中或单独找到 cat。

\n\n

\xe2\x9c\xbd \\Bcat|cat\\B 将在嵌入式情况下找到 cat,例如在证书、catfish 或 tomcat 中,但不能单独找到 cat。

\n