天天看点

/\B(?=(?:\d{3})+$)/g 一条令人费解的正则表达式

网上浏览博客看到要用JavaScript正则表达式解决一个功能, 要在数字中间插入逗号, 用来表示书面的金额写法.

JS代码是这样子的

let test1 = '1234567890'
let format = test1.replace(/\B(?=(?:\d{3})+$)/g, ',')      

里面那条正则表达式花了我一个下午去查资料, 算是补了下对于正则表达式认识上的一些漏洞, 记录下来.

这里有几个概念: 单词边界 和 非捕获分组(non-capturing group)

\B 匹配非单词边界, 即两边都是单词 \w = [0-9a-zA-Z] , 可是非单词边界太泛了, 我们需要一些限定词.

?= 就是一个限定词, 限定后面的字符串都是符合 (?:\d{3})+$  这个规则. 这里面最难理解的应该就是 ?: 这是一个非捕获分组, 当匹配到 一个或多个 紧靠末尾 的三位数时, 这个规则生效, 但并不保存这个分组.

因此整个的意思就是, 我要匹配单词之间的缝隙, 每个缝隙都在一个或多个 紧靠末尾 的三位数之间, 于是 12345678 匹配到的位置就会是 12 | 345 | 678. 

你可能会问, 123456789为什么不会匹配到第一个位置呢? 因为 \B 确保了这个缝隙只会位于两个单词\w之间.

以上就是全部的理解.

转载于:https://www.cnblogs.com/andrew-chen/p/7527433.html