原文:https://www.cnblogs.com/sivkun/p/7123963.html

''.replace(/\B(?=(?:\d{})+\b)/g, ',')

解释:

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

\B : 匹配非单词边界

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

通过上面代码可以理解\b和\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})+\b)/g`什么意思
1. 首先是全局匹配
2. 匹配非单词边界
3. 非单词边界后面有(连续3的整数被个数字加单词边界)
4. 连续的数字不会被捕获
`'123456789'.replace(/\B(?=(?:\d{3})+\b)/g, ',')`
执行过程:
replace函数会进行多次匹配,\b表示了要匹配到单词边界。
1. 首先从1和2中间开始但是后面有8个数字不满足前瞻性条件
2. 然后到2和3中间,同样不满足
3. 到3和4中间,满足后面有6个数字
4. 把在3和4中间的\B(非单词边界)替换为","。
5. 依次往下匹配替换
6. 最终返回新的字符串"123,456,789" 正则很强大,比常规的实现方法简洁方便很多。

javascript 正则(将数字转化为三位分隔的样式)【转】的更多相关文章

  1. javascript 正则(将数字转化为三位分隔的样式)

    '12345678912345678'.replace(/\B(?=(?:\d{3})+\b)/g, ',') 解释: \b : 匹配单词边界,就是位于字符\w([a-zA-Z0-9_])和\W[^a ...

  2. JS将数字转换成三位逗号分隔的样式

    function formatNum(num) { if(!/^(\+|-)?(\d+)(\.\d+)?$/.test(num)){alert("wrong!"); return ...

  3. E - Leading and Trailing 求n^k得前三位数字以及后三位数字,保证一定至少存在六位。

    /** 题目:E - Leading and Trailing 链接:https://vjudge.net/contest/154246#problem/E 题意:求n^k得前三位数字以及后三位数字, ...

  4. C++中double类型的数字如何保留三位小数点详解

    我们知道C语言中,如果要求输出结果保留三位小数,我们可以使用pritf()函数轻松的解决.但是C++的输出运算符<<并没有直接实现这个功能,怎么办呢?之前在找答案的过程中各路大神给出了千姿 ...

  5. 把一串数字表示成千位分隔形式——JS正则表达式的应用

    梳理思路 要先明白的是,我们将要转换成的数字格式是这样:从个位往左数起,每三位前插入一个千位分隔符,,即可以想象成我们要把每三位数字前面的那个空""匹配出来,并替换成千位分隔符,. ...

  6. JavaScript正则验证数字、英文、电话号、身份证号、邮箱地址、链接地址等

    验证是否为数字:/^[0-9]*$/验证是否为汉字:/^[\u4e00-\u9fa5],{0,}$/验证x-y位的数字:/^\d{x,y}$/验证由26个英文字母组成的字符串:/^[A-Za-z]+$ ...

  7. js 格式化数字(每三位加逗号)

    // 方法一 unction toThousands(num) { var result = [ ], counter = 0; num = (num || 0).toString().split(' ...

  8. JS格式化数字(每三位加逗号)

    function toThousands(num) { var num = (num || 0).toString(), result = ''; //判断是否带小数点 if (num.split(' ...

  9. 把一串数字表示成千位分隔形式——toLocaleString()

    听说你用什么正则?我这有个骚操作了解下.. toLocaleString() 方法可把一个 Number 对象转换为本地格式的字符串. ().toLocaleString('en-US') " ...

随机推荐

  1. 面试:atoi和itoa的实现

    1.int atoi(const char* src) nullptr指针 空白字符' ','\t','\n' 符号位 避免值溢出 出错信息保存在全局变脸errnum中 ; int atoi(cons ...

  2. angular ng-repeat元素swiper无法滑动问题解决

    前言 angular中ng-repeat元素swiper无法滑动,angular与swiper冲突. 1.问题 在项目中,我需要利用ng-repeat循环li,比如一个nav导航条,在加入swiper ...

  3. Docker基础教程(常用命令篇)

    1.查看docker信息 # 查看docker版本 $docker version # 显示docker系统的信息 $docker info 2.启动容器 # 交互式 $docker run -it ...

  4. VGG 论文研读

    VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 论文地址 摘要 研究主要贡献是通过非常小的3x3卷积核的神经网络架 ...

  5. C#语法之特性

    在项目中经常可以看到在类属性上面有一个[]的东西,今天讲的东西就是它,它英文名是Attribute,中文名是特性. 一.什么是特性? 首先,我们肯定Attribute是一个类,下面是msdn文档对它的 ...

  6. .4-浅析webpack源码之convert-argv模块

    上一节看了一眼预编译的总体代码,这一节分析convert-argv模块. 这个模块主要是对命令参数的解析,也是yargs框架的核心用处. 生成默认配置文件名数组 module.exports = fu ...

  7. MVC会员注销功能Cookie的应用

    我们实现了<MVC应用程序实现会员登录功能>http://www.cnblogs.com/insus/p/3466512.html 有登录就会有注销功能.此次Insus.NET练习一个MV ...

  8. 设计模式之构建者(Builder)模式

    在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的构建者(Builder)模式的思想进行了一 ...

  9. mysql数据库自动备份脚本

    #!/bin/bash #功能说明:本功能用于备份mysql数据库 #编写日期:2018/05/17 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin ...

  10. java的锁机制——synchronized

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...