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

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

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

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

对于这个正则:

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

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

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

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

而 (?=(\\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

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

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

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

这里的正则是:

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

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

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

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

11.20 正则表达式 断言(?=exp)的更多相关文章

  1. Python for Informatics 第11章 正则表达式二(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.1 正则表达式的字符匹配 ...

  2. SpringBoot(20)---断言(Assert)

    SpringBoot(20)---断言(Assert) 我们在写单元测试的时候,除了接口直接抛异常而导致该单元测试失败外,还有种是业务上的错误也代表着该单元测试失败.好比我们在测试接口的时候, 该接口 ...

  3. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  4. javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)

     (?=exp) 百度百科给的解释:非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用.例如,“Windows(?=95|98|NT|2000) ...

  5. [JS]笔记11之正则表达式

    -->什么是正则表达式-->定义正则-->正则的索引-->元字符-->方括号.量词.其他符号-->RegExp 对象的方法-->String 对象方法 1.定 ...

  6. Python for Informatics 第11章 正则表达式六(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.7 调试 Python有一 ...

  7. Python for Informatics 第11章 正则表达式五(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.4 转义字符 之前我们在正 ...

  8. Python for Informatics 第11章 正则表达式四(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.3 组合查询和抽取 如果我 ...

  9. 原生JavaScript技巧大收集(11~20)-(终于又被我找到这篇文章了)

    11.原生JavaScript加入收藏夹 function AddFavorite(sURL, sTitle) { try { window.external.addFavorite(sURL, sT ...

随机推荐

  1. 基于ModBus-TCP/IT 台达PLC 通讯协议解析

    客户端发送:19 B2 00 00 00 06 06 03 00 27 00 02 上面是modbus客户端发出的报文内容,为modbus tcp/ip协议格式,其前面的六个字节为头字节( heade ...

  2. [VS]反编译_DllToC#_REFLECTOR8.5

    反编译_DllToC#_REFLECTOR8.5 的使用方法可以问度娘 下载地址:百度网盘TonyHeVIP

  3. 码云Gitee上新建项目教程

    1.在浏览器访问,https://gitee.com/: 2.使用用户名.密码登录: 3.在左下角显示当前用户的项目,点击“+”号,创建项目: 4.填写项目的相关信息,项目名称要和本地要上传的项目名称 ...

  4. mysql数据库的理解

    1.索引结构原理: 普通的Btree(binary search tree)就是二叉树,如下图 B+ Tree索引类型则是二叉树的升级版,每个节点存的是 <num ,最后存排序的ROWID Ha ...

  5. 用Itextsharp 组件导出PDF 的文档的方法

    Itextsharp 是一个很强大,开源的,轻量级的 PDF 生成组件,官方网上好像没有相应的API 说明文档,以下是在工作中使用的心得与体会,并附上源码,功能包含了pdf 的创建,table 的创建 ...

  6. Jupyter 常用快捷键

    Command Mode Y : change cell to code M : change cell to markdown R : change cell to raw K : select c ...

  7. C 语言 符合运算符

    复合赋值 5个算术运算符 + - * / % 可以和赋值运算符 = 结合起来形成符合运算符 += -= *= /= %= total += 5 total = total + 5 note:两个运算符 ...

  8. An item with the same key has already been added. Key: Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal.MySqlOptionsExtension

    An item with the same key has already been added. Key: Pomelo.EntityFrameworkCore.MySql.Infrastructu ...

  9. SQLServer 2008 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。

    在用SQL Server 2008 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - ...

  10. HTTPS 基本流程 转载 https://zhuanlan.zhihu.com/p/27395037

    协议 1.HTTP 协议(HyperText Transfer Protocol,超文本传输协议):是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 . 2.HTTPS 协议(HyperTe ...