2017-09-27 119 views
0

/\Bon/匹配“的”中“中午”,并/ye\B/匹配“你们”,在“可能昨天”。 这是为什么发生?乙不工作在正则表达式预期

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

,因为它说

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

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

它不应该。 我错过了什么吗?

也看到我对特罗特的答案 https://stackoverflow.com/a/46439352/6575810

回答

1

/\Bon/匹配“的”中“可能昨天”“中午”,并/ye\B/匹配“你们”,在 。为什么会发生?

这是正确的和预期的行为:

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”匹配的原因;但类似的“上”,“在一个”不:

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

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

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

还应该补充的是,\B不应该与\b混淆,它们有不同的含义。 \b匹配词边界处的锚点。所以,如果你想找到那个“对”与开头的单词,你可以使用/\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

3

评论这种行为似乎是正确的。听起来像你可能想\b字边界。

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

在第一行中,\B是一个非单词边界。换句话说,它是一个边界其中两个前的事情和之后的事是相同的非字的相同的字的一部分或者部分(例如两个空间彼此相邻)。

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

+0

怎么做之前的事情“上”即O和事情经过“上”即没有。是同一个词的一部分? –

+0

@AnkurMarwaha我不确定你在问什么,但是试图为你解决问题,在这个例子中有两个词,“at”和“noon”。 “on”是“中午”一词的一部分。单词边界在第一个“n”之前和最后一个“n”之后。非单词边界将介于第一个“n”和第一个“o”之间,介于“o”和下一个“o”之间,然后介于最后一个“n”之间。 '/ \ Bon /'匹配2“o”和“on”之间的非单词边界。 '\ B'是一个零宽度的锚点,意思是说,匹配时,没有任何东西被添加到返回的匹配字符串中。 –