3 个回答
'12345678967676742324234'.replace(/(?<=^\d{3}(\d{4})*)/g, ' ')

上面那个在长度为3+4n的情况下会在末尾也加空格,如果不需要则改为下面这个

'1231234'.replace(/(?<=^\d{3}(\d{4})*)(?!$)/g, ' ')

补充

以上用到了后行断言,查了一下目前发现浏览器兼容性不是太好,见https://caniuse.com/#feat=js-...

考虑兼容性的话建议选用其他方案?

v8引擎有实现这个功能,如果是在nodejs上跑的话应该是没问题的


在stackoverflow上看后行断言兼容性问题时有人提到某些场景下可以用先行断言代替

这里实现如下

var str = '12345678'
str.replace(new RegExp(`(?=(\\d{4})*\\d{${(str.length-3)%4||4}}$)`,'g'), ' ')

看起来有点麻烦...

一个更麻烦的笨办法

'1234567890123'.replace(/\d/g, (match, offset, s) => (offset++)%4==2&&s.length-offset?match+' ':match)

应该是最后一次补充

其实不用后行断言也可以很简单

"123123456789".replace(/((?:^|\d)\d{3})(?!$)/g, '$1 ')

看来还是要多学习一个

const g = /^\d{3}|\d{1,4}/g;
const matched = input.match(g);
return matched ? matched.join(' '): input;

一步到位没想到, 可以把他拆成两步

判断长度

  1. < 3 不用管
  2. >=3 前3 加空格,取除前3以外的字符,replace(/(d{4})/g, '$1 ')
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏