• 11.20 正则表达式 断言(?=exp)


    今天看源代码,研究了一下qz写的这个方法:

    // 添加逗号分隔,返回为字符串  
    comma: function(length) {
        if (!length || length < 1) length = 3;
        var source = ('' + this).split('.');
        source[0] = source[0].replace(new RegExp('(\d)(?=(\d{' + length + '})+$)', 'ig'), '$1,');
        return source.join('.');  
    },

    将一个数字的整数部分加上千分位分隔符,即从后往前,每三位数字加一个逗号。

    代码里,source[0]取数字的整数部分,将整数部分拿出来,加上逗号后再拼上小数部分即完成。

    对于这个正则:

    (\d)(?=(\d{3})+$)

    首先,(\d)代表一个数字,正则表达式加括号是起到一个分组作用,将匹配到的内容放到match集合中,$相当于集合名字,1-9相当于索引,$1...$9相当于对应索引的值。

    这里是为了给匹配到的数字加上逗号,来进行替换。

    $1,$2...是表示的小括号里的内容 。$1是第一个小括号里的 ,$2是第2个小括号里的 
    比如 /gai([w]+?)over([d]+)/ ,匹配 gainover123 
    $1= 括号里的 n 
    $2= 第2个括号里的 123

    而 (?=(\d{3})+$) 用到了断言(?=exp)。解释如下:

    这个括号是指前一个括号的后面一定 肯定是 以 1个或多个 3个数字 结尾。

    d 匹配从0到9的数字

    {n} 精确匹配n次
    + 匹配前面元字符一次或多次

    整理一下逻辑,这个正则表达式是对于每一个数字,断言它后面是否是1个或多个3个数字结尾(后面跟的一定是3n(n>0)个数字),如果是,匹配成功,用该数字加逗号替换它,不是的话,匹配失败。

    以12345678为例,从左至右匹配,首先是1,1后面是2345678$,7个数字,不符合断言,来到2,后面是345678$,符合断言,因此用 2, 替换 2,来到3,3后面是45678$,不符合断言,4也同样,5后面是678$,符合断言,替换为5, 而6 后面是 78$ ,不符合断言,7 8 也不符合,匹配结束。因此,最终结果是 12,345,678

    在查资料的过程中,还发现了另一种方法:

    "115000000".split("").reverse().join("").replace(/(d{3})(?=[^$])/g, "$1,").split("").reverse().join("");

    它是将数字先进行反转,然后从左往右,每三位加一个逗号,最后再进行反转,效果相当于 从后往前每三位加逗号。

    这里的正则是: 

    (d{3})(?=[^$])
    [^xyz] 查找任何不在方括号中的字符 

    d{3} 3个数字 [^$] 匹配后面不是结束符

    对于每三个数字,断言它后面接的不是$,即不在末尾,则匹配成功。

    以123456789为例,首先123,断言成功,替换为123, 456 断言成功,替换为456, 而789 后面是$ ,断言失败,匹配结束,结果为123,456,789

  • 相关阅读:
    Web开发中需要了解的东西
    Javascript:谈谈JS的全局变量跟局部变量
    多角度看.NET面试题
    java http大文件断点续传上传方法
    java http大文件断点续传上传问题
    java http大文件断点续传上传功能
    java http大文件断点续传上传解决方案
    java http大文件断点续传上传实例
    java http大文件断点续传上传示例
    java http大文件断点续传上传源代码
  • 原文地址:https://www.cnblogs.com/yan89/p/7867351.html
Copyright © 2020-2023  润新知