如何正确理解正则表达式中的分隔符 \b

前言:好久不见,博客园。

最近在学习研究regex,其中有个特迷惑自己的知识点是分隔符 ( word boundary) [\b] (注:为了方便,后文都以[]来包含字符,并不是reg规则里面的[] ),后面查询咨询了解,明白了,记录下来,希望帮到恰好迷惑的你。

[\b] 官方解释是:Match a word boundary,匹配一个单词边界,也就是单词和空格之间的位置,它本身不匹配任何字符。一般它有三种情况,如下:

  1. 在一个 \w 字符之前,eg:  \bend
  2. 在一个 \w 字符之后,eg: end\b
  3. 在两个字符之间 ;

情况1,2都比较容易理解,这里就略过,主要从第3种情况来讲讲理解。

最开始从网上看到这样一句话:“如果需要更精确的说法,[\b] 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) [\w] (匹配字母或数字或下划线或汉字)”;

那做个试验:

    var reg = /end\band/g;
var string = 'wenkend,end,and,endend';
alert( reg.test(string) ) ; //false

根据上述理解 [\b] 要求它分隔的是一边是 [\w] , 一边是非 [\w]。我最开始理所当然的理解为正则表达式 [ end\band ] 匹配字符串 [end,and]  end的右边是分隔符 [,]  ,符合匹配,and的左边是分隔符 [,] , 符合匹配。那么它就应该符合匹配,可是为什么结果是 false 呢?

后面发现自己大错特错。

正确理解如下分三步来理解:

-----------------
/end\band/g, "end,and" (匹配end,true)
| |
----------------- /end\band/g, "end,and" (匹配end后面是否有分隔符,有[,] - true)
| |
------------------ /end\band/g, "end,and" (now,接下来匹配的是否是字符and,因为 [\b]只是匹配匹配一个位置,本身并不匹配任何字符,所以
                                 等待匹配的字符串应该是 [,and] ,而不是[and],显而易见,[,and] 并不符合匹配规则 [and] - false)

总结来说就是:[end\band] 或者其他类似这样的正则表达式是没有意义的,可以说永远也不会存在的。

如果 [\b] 在中间,regex表达式写法必须遵循在 [\b] 的左右两侧一个是[\w],一个是非 [\w],例如 [end\,] .

如有错误或疑问或建议,请指正,谢谢~

上一篇:Spring Boot 揭秘与实战 自己实现一个简单的自动配置模块


下一篇:DevExpress 之 GridControl 自定义列