带有特殊字符的词边界 `\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
。请注意此正则表达式中的非单词边界 \B 。 Case 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
对于正则表达式 (456)\b
和输入 123456 xyz
它按预期工作并且输出为 456。Case 1..
对于几乎相同的正则表达式 (456)#\b
和输入 123456# xyz
,我希望输出为 456#
。因为 \b
匹配完 #
.
但是正则表达式引擎找不到匹配项。 Case 2.
奇怪的是,它适用于正则表达式 (456)#\B
。请注意此正则表达式中的非单词边界 \B 。 Case 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