正则表达式 边界
正则表达式中:
- \b 表示单词边界
- \B 表示非单词边界,应理解为(非单词)边界,而不是非(单词边界),它仍然匹配的是边界
边界
我将正则中的位置分为 字符的占位 和 字符的间隙。
字符的占位是显式的位置。
以 I'm iron man
为例。
肉眼可见的字母 符号 空格都是可以占位的字符,也就是可以用下标获取到字符的位置。
字符的间隙是隐式的位置。
即显示位置之间的位置,比如I
和'
之间的位置,字符串开头和I
之间的位置等。
边界 指的是占位的字符左右的间隙位置。
单词
正则中所说的单词指的是 \w
可以匹配的字符,即数字、大小写字母以及下划线 [0-9a-zA-Z_]
\b 单词边界
单词边界匹配的就是这样的间隙位置:
左边占位的字符或右边占位的字符,至少有一个不是 \w
// 只有首尾位置匹配
console.log('0aZ_'.replace(/\b/g, '.')) // .0aZ_.
// +不是\w,所以它的左右间隙都可以被匹配
console.log('a+a'.replace(/\b/g, '.')) // .a.+.a.
// 空格也不是\w,所以它的左右间隙都可以被匹配
console.log('a a'.replace(/\b/g, '.')) // .a. .a.
\B 非单词边界
理解了 \b
,\B
就好理解了。
它匹配的也是 边界 ,针对的是 与 \b
相反 的 非单词(\W
)。
也就是,左右占位的字符,都必须是 \w
。
或者说 所有不能被\b
匹配的 边界。
console.log('0aZ_'.replace(/\B/g, '.')) // 0.a.Z._
console.log('a+a'.replace(/\B/g, '.')) // a+a
console.log('a a'.replace(/\B/g, '.')) // a a