zoukankan      html  css  js  c++  java
  • javascript 正则(将数字转化为三位分隔的样式)

    1 '12345678912345678'.replace(/B(?=(?:d{3})+)/g, ',')

    解释:

     : 匹配单词边界,就是位于字符w([a-zA-Z0-9_])和W[^a-zA-Z0-9_]之间的位置,或者位于字符w和字符串的开头或者结束之间的位置。

    B : 匹配非单词边界

    var reg = /d/g;
    var str = '123';
    reg.exec(str);//["1",index:0,input:"123"]
    reg.exec(str);//null
    
    reg = /d/g;
    reg.exec(str);//["3",index:2,input:"123"]
    reg.exec(str);//null
    
    reg = /Bd/g;
    reg.exec(str);//["2", index: 1, input: "123"]
    reg.exec(str);//["3", index: 2, input: "123"]
    reg.exec(str);//null
    
    
    reg = /dB/g;
    reg.exec(str);//["1", index: 0, input: "123"]
    reg.exec(str);//["2", index: 1, input: "123"]
    reg.exec(str);//null

    通过上面代码可以理解和B到底是什么玩意了。

    `(?:exp)`:正则表达式中小括号具有分组和捕获双重作用,如果在小阔号里面开始加上`?:`则可以使其不被捕获。
    `exp1(?=exp2)`:正向前瞻(零宽正向先行断言,零宽的意思是(?=exp2)不占据位置,只是表示一个期望),要匹配的exp1要满足后面是exp2
    `exp1(?!exp2)`:负向前瞻(零宽负向先行断言),要匹配的exp1要满足后面是不是exp2
    var str = '你好吗 你好啊 你好呀';
    var reg = /好(?=啊)/g;
    reg.exec(str);//["好", index: 5, input: "你好吗 你好啊 你好呀"]
    reg.exec(str);//null
    reg = /好(?!啊)/;
    reg.exec(str);//["好", index: 1, input: "你好吗 你好啊 你好呀"]
    reg.exec(str);//["好", index: 9, input: "你好吗 你好啊 你好呀"]
    reg.exec(str);//null
    //说明一下零宽,下面这个正则表示`你`的后面要紧跟着`好`才能匹配,期望后面是`好`!
    //但是后面紧跟着一个`d`,理解的时候把`(?=好)`忽略(因为是零宽,不占据位置),
    //这就表示在`你`的后面要跟一个数字才能匹配,这就跟上面那个期望相互矛盾,
    //因此这个正则不会匹配任何字符串。
    reg = /你(?=好)d/;
    reg.exec(str);//null
    reg.test(str);//false
    reg.test('你好');//false
    reg.test('你好1');//false
    reg.test('你1好');//false
     
    再看`/B(?=(?:d{3})+)/g`什么意思
    1. 首先是全局匹配
    2. 匹配非单词边界
    3. 非单词边界后面有(连续3的整数被个数字加单词边界)
    4. 连续的数字不会被捕获
    `'123456789'.replace(/B(?=(?:d{3})+)/g, ',')`
    执行过程:
    replace函数会进行多次匹配,表示了要匹配到单词边界。
    1. 首先从1和2中间开始但是后面有8个数字不满足前瞻性条件
    2. 然后到2和3中间,同样不满足
    3. 到3和4中间,满足后面有6个数字
    4. 把在3和4中间的B(非单词边界)替换为","。
    5. 依次往下匹配替换
    6. 最终返回新的字符串"123,456,789"

    正则很强大,比常规的实现方法简洁方便很多。
    
    
    
  • 相关阅读:
    最短路必经点(边)
    [HNOI2008]越狱
    【模版】卢卡斯定理
    偶数
    [USACO17FEB]Why Did the Cow Cross the Road I S
    [USACO17FEB]Why Did the Cow Cross the Road II S
    [USACO07NOV]电话线Telephone Wire
    [JSOI2007]祖码Zuma
    单人纸牌_NOI导刊2011提高(04)
    [USACO13OPEN]重力异常
  • 原文地址:https://www.cnblogs.com/sivkun/p/7123963.html
Copyright © 2011-2022 走看看