\ B在正则表达式

时间:2017-09-27 04:07:26

标签: javascript regex

/\Bon/匹配" on"在"中午"和/ye\B/匹配" ye"在"可能在昨天"。 为什么会这样?

根据以下问题 https://stackoverflow.com/a/6664167/6575810

正如它所说

  

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

     

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

不应该。 我在这里错过了什么吗?

另见我对trott的答案的评论 https://stackoverflow.com/a/46439352/6575810

2 个答案:

答案 0 :(得分:3)

这种行为似乎是正确的。听起来你可能希望\b用于单词边界。

/\Bon/.test('at noon'); // true
/\bon/.test('at noon'); // false

在第一行中,\B是非字边界。换句话说,它是一个边界,前面的东西和后面的东西都是同一个单词的一部分或同一个非单词的一部分(就像彼此相邻的两个空格)。

在第二行中,\b需要是正则表达式匹配的单词边界。它不匹配,因为它出现在一个单词的中间。

答案 1 :(得分:2)

  

/\Bon/匹配“正午”中的“on”,/ye\B/匹配“ye”in   “可能昨天”。为什么会这样?

这是正确和预期的行为:

console.log("at noon".match(/\Bon/)[0]);
console.log("possibly yesterday".match(/ye\B/)[0]);

\w等匹配单个"word" character的字符类或与单个空白字符匹配的\s不同,\Banchor point不匹配一个字符,而是断言该锚点位于特定的位置。在\B的情况下,它声明该锚不在单词边界。

单词边界可以是"word character"位于空格字符旁边的位置,也可以是字符串的开头或结尾。

因此,/\Bon/实际上意味着找到一个不在单词开头的“on”。这就是为什么“no on ”中的“on”匹配;但是像“在一个”中的“on”之类的东西却没有:

    console.log("at one".match(/\Bon/));

以同样的方式,/ye\B/实际上意味着找到一个不在单词末尾的“ye”。所以,“可能 ye sterday”中的“ye”匹配,因为它不在单词的末尾,而“可能再见”结束时的“ye”不会:

console.log("possibly goodbye".match(/ye\B/));

还应该补充说\B不应与\b混淆,它们有不同的含义。 \b匹配单词边界处的锚点。因此,如果您想找到一个以“on”开头的单词,您可以使用/\bon/

console.log("one at noon".match(/\bon/)); // finds the "on" in one, but not the "on" in noon

同样,它可用于在单词的末尾找到某些内容:

    console.log("goodbye yesterday".match(/ye\b/)); // finds the "ye" in goodbye, but not the "ye" in yesterday