理解千分位正则表达式:/(?<=\d)(?=(\d{3})+(?!\d))/g;

5 阅读4分钟

理解千分位正则表达式:/(?<=\d)(?=(\d{3})+(?!\d))/g;

相信有很多小伙伴和我有一样的疑问,上面正则表达式应该如何理解呢?今天我们就来详细聊一聊。

首先我们要知道正则的正向预查(?=pattern)和反向预查(?<=pattern)是用来匹配位置,这一点很重要。如果有不清楚的小伙伴可以自行去了解,这里不着重介绍。

在开始之前我们再了解一下关于正向预查和反向预查的基本知识。

正向预查和反向预查又叫零宽断言,所谓零宽断言:断言指必须能满足一定条件,零宽指没有宽度(指的是不包括满足这个条件的字符)。

零宽断言分为两类:正向零宽和负向零宽。

具体有以下四种:

1、正向零宽先行断言:x(?=exp),表示:x的后面必须存在exp这个条件。

2、正向零宽后发断言:(?<=exp)x,表示:x的前面必须存在exp这个条件。

3、负向零宽先行断言:x(?!exp),表示:x的后面必须不存在exp这个条件。

4、负向零宽后发断言:(?<!exp)x,表示:x的前面必须不存在exp这个条件。

总结:

  ()表示这个条件,(?)中的?表示这是一个零宽断言(其实是一个非捕获组);
  
  (?<)中的<表示这个断言条件是在前面,没有则表示后面;
  
  (?<=)中的=表示存在;
  
  (?<!)中的!表示不存在;

我们知道了这个知识点之后就可以正式开始了。

这个正则表达式我们可以分为两部分(?<=\d)和(?=(\d{3})+(?!\d))。

前半部分的意思是该位置的前面必须是数字,后半部分的意思是该位置的后面必须是三个数字组合而且后面还必须不能是数字。

举个栗子:

"123456789".replace(/(?<=\d)(?=(\d{3})+(?!\d))/g, ',');
/**
 * 解析:
 * 第一步,匹配数字“1”前面的位置,这个位置的前面不是数字,所以不符合断言条件,进入下一轮匹配.
 * 第二步:匹配数字“12”中间的位置,后面是“234”,“567”, “89”,“89”不符合后半部分中的必须是三个数字的组合这个断言条件,所以这个位置也不符合,进入下一轮匹配
 * 第三步:匹配数字“23”中间的位置,后面是“345”,“678”, “9”,“9”不符合后半部分中的必须是三个数字的组合这个断言条件,所以这个位置也不符合,进入下一轮匹配
 * 第四步:匹配数字“34”中间的位置,后面是“456”,“789”,该这个位置符合条件,会被替换成“,”,此时是:123,456789。进入下一轮匹配
 * 第五步:匹配数字“45”中间的位置,后面是“567”,“89”,“89”不符合后半部分中的必须是三个数字的组合这个断言条件,所以这个位置也不符合,进入下一轮匹配
 * 第六步:匹配数字“56”中间的位置,后面是“678”,“9”,“9”不符合后半部分中的必须是三个数字的组合这个断言条件,所以这个位置也不符合,进入下一轮匹配
 * 第六步:匹配数字“67”中间的位置,后面是“789”,该这个位置符合条件,会被替换成“,”,此时是:123,456,789。进入下一轮匹配
 * 第六步:匹配数字“78”中间的位置,后面是“89”,“89”不符合后半部分中的必须是三个数字的组合这个断言条件,所以这个位置也不符合,进入下一轮匹配
 * 第六步:匹配数字“89”中间的位置,后面是“9”,“9”不符合后半部分中的必须是三个数字的组合这个断言条件,所以这个位置也不符合,进入下一轮匹配
 * 第六步:匹配数字“9”后面的位置,后面是“”,“”不符合后半部分中的必须是三个数字的组合这个断言条件,所以这个位置也不符合,匹配结束
 * 所以最终的结果就是:123,456,789
 */