带有特殊字符的词边界 `\b` 和 `\B` 的奇怪行为

Strange behaviour of word boundary `\b` and `\B` with special characters

对于正则表达式 (456)\b 和输入 123456 xyz 它按预期工作并且输出为 456。Case 1..

对于几乎相同的正则表达式 (456)#\b 和输入 123456# xyz,我希望输出为 456#。因为 \b 匹配完 #.

应该还是会匹配到行尾

但是正则表达式引擎找不到匹配项。 Case 2.

奇怪的是,它适用于正则表达式 (456)#\B。请注意此正则表达式中的非单词边界 \BCase 3\B 在这里匹配什么?

我经历了This answer for understanding \b and \B,看来我的理解是正确的。

那为什么奇怪呢?我在这里错过了什么?为什么在案例 2 和案例 3 中 \B 有效而 \b 无效?

A word character is a character from a-z, A-Z, 0-9, including the _ (underscore) character.

所以#不是单词字符,所以后面没有单词边界

单词边界 \b 定义为单词和非单词字符之间的点。假设标准 C 语言环境,那么 # 和 space 都是非单词字符,因此它们之间没有单词边界。

单词边界使用以下正则表达式声明位置 - (^\w|\w$|\W\w|\w\W)。这里的一个词是[a-zA-Z0-9_]

中的任何东西

所以在你的情况下,对于正则表达式 (456)#\b,尝试匹配字符串 123456# xyz 将失败,因为 # 和后面的 space 都是非单词(需要是一个词和一个 non-word 作为边界),因此不满足上述正则表达式。

有趣的是,如果您尝试在字符串中的 # 后面添加一个词,比如 123456#b xyz,它会匹配,如图所示 here