"115000000".split("").reverse().join("").replace(/(\d{3})(?=[^$])/g, "$1,").split("").reverse().join("");
在网上找到了一种解法,可是有个地方没明白。如下:
replace(/(\d{3})(?=[^$])/g, "$1,")
这里的(?=[^$])有什么作业??难道就 replace(/(\d{3})/g, "$1,")不可以吗??
麻烦大家看看,帮我解答下,,蟹蟹
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。
可以理解为?=
是一个狂妄的预言家,假设有正则 /abc?=xxx/
,它预言自己出现的位置后面一定、肯定、必须、只能是 xxx
,如果不是,那它会以死明志的(就是匹配失败)。
那么:
1. (?=[^$])
会匹配除字符除末尾所有的位置
2. /(\d{3})(?=[^$])/
会匹配连续的三个数字,并且这三个数字不能在字符串的末尾
3. 题主疑问的 replace(/(\d{3})/g, "$1,")
,如果字符串长度刚好是三的倍数,那最后三个字符后也会加上逗号。比如 123456789.replace(/(\d{3})/g, "$1,"); // 123,456,789,
是要这样吗?
var number = 123456789;
number.toLocaleString() // "123,456,789"
(?=)
为js正则表达式中的正向前瞻,出现在特定字符之前的字符,只有当字符后面跟着某个特定字符才去捕获它。
你的例子中,/(\d{3})(?=[^$])/g
表示只有在匹配了(\d{3})
之后匹配到了[^$]
才算匹配成功,$
为字符串的结束符,[^$]
表示除字符串结束符以外的字符。如果去掉这部分,那么可能在数字最后也会添加上,
。
同理还有负向前瞻:只有当字符后面不跟着某个特定字符时才去捕获它,写法为(?!)
。