如题,整数部分每三个加一个逗号分隔,求解析
num.replace(/\B(?=(\d{3})+(?!\d))/g, ",")
可能是不懂里面的 ?=
吧。
非获取匹配,正向肯定预查,在任何匹配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.
时,它会匹配sing
和danc
。
(?!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 ',';
});
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
这个正则表达式不是匹配的字符,而是“位置”

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