一个正则替换,看不太懂

如题,整数部分每三个加一个逗号分隔,求解析

num.replace(/\B(?=(\d{3})+(?!\d))/g, ",")

图片描述

阅读 2.9k
3 个回答

这个正则表达式不是匹配的字符,而是“位置
?=作用的范围就是我标红的两个括号
\B(?=(\d{3})+(?!\d))
它的意思是什么呢?
就是说我要匹配的这个“位置”,它后面应该是一下内容——三个数字为一组,有若干个这样的组,且这样的组匹配结束后,后面没有数字了,匹配出来的位置如图(虚线表示):
图片描述
于是替换的结果,就是在这些虚线所代表的位置上插入,

可能是不懂里面的 ?= 吧。

非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

放在括号里面用来做位置指定

(?=exp) 匹配exp前面的位置:

(?=exp)也叫零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀 exp。比如 \b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.时,它会匹配singdanc

(?!exp) 匹配后面跟的不是exp的位置。

/\B(?=(\d{3})+(?!\d))/g 中,正则表达式匹配了 3 个连续数字之前的位置。

\B 不是 否\b(与W,w,D,d,S,s间关系不同,他只匹配位置)

他匹配一个前后字符都是相同类型的位置:都是单词或者都不是单词。

一个字符串的开始和结尾都被认为是非单词。

//都是单词
> var str3 = '1--23'
undefined
> str3.replace(/\B/g, ',')
'1-,-2,3'
//都不是单词
> var str2 = '1-23'
undefined
> str2.replace(/\B/g, ',')
'1-2,3'
//开始和结尾也算都不是单词
> str = ''
''
> str.replace(/\B/g, ',')
','

应用:

B既要复合自身要求(都是单词或者都不是单词),也要复合(?=)即正向肯定查找的需求)

var num = 123456789;
num.replace(/\B(?=(\d{3})+(?!\d))/g, ",")

所以上述代码可以简化为

var res = num.replace(/\B(?=(\d{3})+$)/g, function(all, itemA, itemB) {
    console.log(all, itemA, itemB);
    return ',';
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题