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

时间:2019-05-21 12:30:52

标签: regex word-boundary

对于正则表达式(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,似乎我的理解是正确的。

那为什么奇怪呢?我在这里想念什么?为什么\B在情况2和情况3不能工作时\b工作?

3 个答案:

答案 0 :(得分:1)

  

单词字符是a-z,A-Z,0-9中的字符,包括_   (下划线)字符。

因此#不是单词字符,因此后面没有单词边界

答案 1 :(得分:1)

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

中的所有单词

因此,在您的情况下,对于正则表达式(456)#\b,尝试匹配字符串123456# xyz将会失败,因为#及其后面的空格都是非单词(必须是一个单词和一个边界的非单词),因此不满足上述正则表达式。

有趣的是,如果您尝试在字符串中的#之后添加一个单词,例如说123456#b xyz,它就会匹配,就像显示的here

答案 2 :(得分:0)

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