11.20 正则表达式 断言(?=exp)
今天看源代码,研究了一下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)的更多相关文章
- Python for Informatics 第11章 正则表达式二(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.1 正则表达式的字符匹配 ...
- SpringBoot(20)---断言(Assert)
SpringBoot(20)---断言(Assert) 我们在写单元测试的时候,除了接口直接抛异常而导致该单元测试失败外,还有种是业务上的错误也代表着该单元测试失败.好比我们在测试接口的时候, 该接口 ...
- 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反
一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...
- javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)
(?=exp) 百度百科给的解释:非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用.例如,“Windows(?=95|98|NT|2000) ...
- [JS]笔记11之正则表达式
-->什么是正则表达式-->定义正则-->正则的索引-->元字符-->方括号.量词.其他符号-->RegExp 对象的方法-->String 对象方法 1.定 ...
- Python for Informatics 第11章 正则表达式六(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.7 调试 Python有一 ...
- Python for Informatics 第11章 正则表达式五(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.4 转义字符 之前我们在正 ...
- Python for Informatics 第11章 正则表达式四(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.3 组合查询和抽取 如果我 ...
- 原生JavaScript技巧大收集(11~20)-(终于又被我找到这篇文章了)
11.原生JavaScript加入收藏夹 function AddFavorite(sURL, sTitle) { try { window.external.addFavorite(sURL, sT ...
随机推荐
- C#使用AppDomain时的异常分析:Object ‘XXXX.rem’ has been disconnected or does not exist at the server.
在使用C#的应用程序域的时候,碰到这么一个异常: System.Runtime.Remoting.RemotingException: Object ‘/76e7cd41_2cd2_4e89_9c03 ...
- Qt之菜单栏工具栏入门
菜单栏基本操作 创建菜单栏 QMenuBar *menuBar = new QMenuBar(this); //1.创建菜单栏 menuBar->setGeometry(,,width(),); ...
- 使用svn创建分支!
1 在主分支上 右键svn---选中 branch/Tag选项 2,填写新分支目录之后 点击 ok键 3,在新创建的分支目录 右键 --> Chenckout下 就可以把代码拉下来了 4.更新 ...
- 检查邮箱IP是否在国际反垃圾邮件组织的黑名单中
有时候邮件发不出去,很有可能就是邮件服务器的IP被国际上一些反垃圾组织列入黑名单了,这时你可以通过返回的邮件判断是否进入黑名单,或者通过以下查询地址看是否被列入,然后一个个申请移除: http://m ...
- GNU C和C99标准中的可变参数宏(variadic macros)
用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变参数表,如: void printf(const char* format, …); 直到最近,可变参数表还是只 ...
- 线上CPU100%排查
生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题? 这个问题分为两版回答!高调版对不起,我是做研发的,这个问题在生产上是不可能遇见的!因为研发是不可能直接操作生 ...
- springboot学习二:配置文件配置
springboot默认读取application*.properties #######spring配置####### spring.profiles.active=dev //引入开发配置文件 a ...
- ubuntu 14.04解决wifi连接不稳定问题
问题描述:开机后wifi功能可以使用,一段时间后无法上网,重启后正常. 三种方法: 一 将/etc/ppp/options 文件第232行中的 cp-echo-failure 4 改为 lcp-ech ...
- java-框架-索引
spring 整体了解 spring 入门demo Spring整体了解 spring梳理 Spring线程池的5个要素 spring的事务隔离级别以及传播性 事务4个隔离界别及脏读,不可重复读,幻读 ...
- Linux 下的 Docker 安装与使用
一.安装与配置 1.安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2.设置阿里云镜像源 sudo yum ...