两个正则坑

  先看第一个,代码

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
        }
原文地址:https://www.cnblogs.com/zhansu/p/6373926.html