正则表达式将阿拉伯数字每隔三位为一逗号分离

"115000000".split("").reverse().join("").replace(/(\d{3})(?=[^$])/g, "$1,").split("").reverse().join("");

在网上找到了一种解法,可是有个地方没明白。如下:

replace(/(\d{3})(?=[^$])/g, "$1,")

这里的(?=[^$])有什么作业??难道就 replace(/(\d{3})/g, "$1,")不可以吗??
麻烦大家看看,帮我解答下,,蟹蟹

阅读 8.3k
3 个回答

(?=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})之后匹配到了[^$]才算匹配成功,$为字符串的结束符,[^$]表示除字符串结束符以外的字符。如果去掉这部分,那么可能在数字最后也会添加上,

同理还有负向前瞻:只有当字符后面不跟着某个特定字符时才去捕获它,写法为(?!)

宣传栏