两个正则坑
先看第一个,代码
var re = /^\d{3}\-\d{3, 8}$/; var r1 = re.test('010-12345'); console.log(r1);
结果控制台给出false。问题在哪?
发现把{3, 8}逗号后的空格删了就好了。习惯性在逗号后敲空格了,尤其是ES6对对象进行扩展以后,以后不能这样子了。
接下来看个比较难的,零宽正向断言,不熟悉的话可以看看《JS权威指南》和这篇文章。
在写货币千分位格式化的时候,正确是这样子的,先确定了零宽的位置:222335,然后匹配了前面的捕获组:32,接下来把32换成了32, 。因为是全局匹配,我们接着进行,先确定了零宽的位置:335,然后匹配了前面的捕获组:222,接下来把222换成了222, 。我们接着进行,先确定了零宽的位置:335,然后前面匹配不上了,正则匹配结束。另外,对于87这样的两位数,匹配是不成功的,返回原数。
var a = '32222335'.replace(/(\d{1,3})(?=(\d{3})+$)/g, '$1,'); /*32,222,335*/
倘若把零宽断言的?=去了会怎么样呢,答案很明显
var a = '32222335'.replace(/(\d{1,3})(\d{3})+$/g, '$1,'); /*32,*/
坑出现了
var a = '32222335'.replace(/(\d{1,3})(?=(\d{3})+)$/g, '$1,'); /*32222335*/
把匹配字符串结尾位置的$拿出来后,就成这样子了。为什么会这样子,没太搞明白。暂时的理解是匹配不成功,没有字符串替换掉。因为要求1-3个数字结尾,而结尾的后面还要有1个或以上的零宽断言,这没法实现,所以不成功。
真正要精通正则还是挺难的。
另,带小数点的
function currency (num) { if (num === null || num === '' || num === undefined) { num = '0.00' } num = Number(num).toFixed(2).toString().replace(/\d+/, function (n) { return n.replace(/(\d)(?=(\d{3})+$)/g, function ($1) { return $1 + ',' }) }) return num }