如何用正则表达式匹配指定范围字符并替换实现银行卡号脱敏?
方案1:零宽断言正则(最贴合你现有代码写法)
你可以直接用带正向肯定后行断言和正向肯定先行断言的正则,精准匹配前4位之后、后4位之前的每一位数字:
const hide = card => card.replace(/(?<=\d{4})\d(?=\d{4})/g, 'X')
测试效果:输入12345678901234,输出结果就是你要的1234XXXXXX1234。
正则说明:
(?<=\d{4}):后行断言,要求匹配的数字前面必须有4位数字\d:匹配1位待替换的中间数字(?=\d{4}):先行断言,要求匹配的数字后面必须还有4位数字- 加全局修饰符
g,匹配所有符合要求的中间位,每一位都会被替换成X
方案2:捕获分组写法(兼容性更好,适配不支持后行断言的旧运行环境)
如果你的运行环境不支持ES2018之后才引入的后行断言,可以用捕获分组的方式实现:
const hide = card => card.replace(/^(\d{4})\d*(\d{4})$/, (_, first4, last4) => `${first4}${'X'.repeat(card.length - 8)}${last4}` )
说明:
- 先捕获前4位和后4位到分组1和分组2
- 中间部分的长度等于总长度减8,直接生成对应长度的X字符串拼接即可
注意事项
以上实现默认传入的银行卡号是纯数字格式、且长度大于等于8位,如果有格式校验需求可以先加一层判断,比如先判断/^\d{8,}$/.test(card)再做脱敏,避免异常输入报错。
内容的提问来源于stack exchange,提问作者akko
相关产品推荐
相关产品推荐

