例如,我们通过一个函数把一个number类型的数字转换成一个字符串,并且每三位给他加上一个',';1999->1,999先看看(?=pattern)的使用,下面这个是正确的:functiongroupByCommas(n){returnn.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",");}console.log(groupByCommas(1234567));//1,234,567如果我们删掉(\d{3})后面的'+'的话,全局标志依然还在,但是这个时候,就只能匹配字符串中的部分了。functiongroupByCommas(n){returnn.toString().replace(/\B(?=(\d{3})(?!\d))/g,",");}console.log(groupByCommas(1234567));//1234,567我的看法是这样的:正则表达式等价于/\B(?=(\d{3}){1}(?!\d))/g所以当匹配到匹配项的时候,index的位置已经到了4与5之间,而前面的正则是通过/\B(?=(\d{3}){1}(?!\d))/g/\B(?=(\d{3}){2}(?!\d))/g匹配。最后如果我们把?=换成?:的话:functiongroupByCommas(n){returnn.toString().replace(/\B(?:(\d{3})+(?!\d))/g,",");}console.log(groupByCommas(1234567));//1,
2 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp(?:exp)表示非捕获性分组,它不会存在匹配成功后的分组里可以看下我在这里对?=的解释
添加回答
举报
0/150
提交
取消