前言:好久不见,博客园。
最近在学习研究regex,其中有个特迷惑自己的知识点是分隔符 ( word boundary) [] (注:为了方便,后文都以[]来包含字符,并不是reg规则里面的[] ),后面查询咨询了解,明白了,记录下来,希望帮到恰好迷惑的你。
[] 官方解释是:Match a word boundary,匹配一个单词边界,也就是单词和空格之间的位置,它本身不匹配任何字符。一般它有三种情况,如下:
- 在一个 w 字符之前,eg: end
- 在一个 w 字符之后,eg: end
- 在两个字符之间 ;
情况1,2都比较容易理解,这里就略过,主要从第3种情况来讲讲理解。
最开始从网上看到这样一句话:“如果需要更精确的说法,[] 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) [w] (匹配字母或数字或下划线或汉字)”;
那做个试验:
var reg = /endand/g; var string = 'wenkend,end,and,endend'; alert( reg.test(string) ) ; //false
根据上述理解 [] 要求它分隔的是一边是 [w] , 一边是非 [w]。我最开始理所当然的理解为正则表达式 [ endand ] 匹配字符串 [end,and] end的右边是分隔符 [,] ,符合匹配,and的左边是分隔符 [,] , 符合匹配。那么它就应该符合匹配,可是为什么结果是 false 呢?
后面发现自己大错特错。
正确理解如下分三步来理解:
----------------- /endand/g, "end,and" (匹配end,true) | | ----------------- /endand/g, "end,and" (匹配end后面是否有分隔符,有[,] - true) | | ------------------ /endand/g, "end,and" (now,接下来匹配的是否是字符and,因为 []只是匹配匹配一个位置,本身并不匹配任何字符,所以
等待匹配的字符串应该是 [,and] ,而不是[and],显而易见,[,and] 并不符合匹配规则 [and] - false)
总结来说就是:[endand] 或者其他类似这样的正则表达式是没有意义的,可以说永远也不会存在的。
如果 [] 在中间,regex表达式写法必须遵循在 [] 的左右两侧一个是[w],一个是非 [w],例如 [end\,] .
如有错误或疑问或建议,请指正,谢谢~