2024年6月19日
之前看过用下面脱敏手机号的方式,好处是方便调整位数

String v = "13333333333";
String s = v.replaceAll("(?<=.{3}).(?=.{4})", "*"); // 133****3333

反向预查(?<=.{3})和正向预查(?=.{4})不能理解成保留位数
是用来匹配(前面有3个字符)(后面有4个字符)的字符,这些字符每一个都被replaceAll替换成参数符号"*"
按照这个思路,发挥空间还是有的,刁钻一点的比如邮箱@前全部替换成*,且最多5个*

String v = "1234567890@qq.com";
String s = v.replaceAll("(.+(?=.{4,}@)|.(?=.*@))", "*"); // *****@qq.com

思路:先匹配@4个字符再往前的字符,这些字符替换成一个*;再把剩下的4个每一个都替换成*凑够5个。
.(?=.{4,}@)匹配@前的第5个字符
.+(?=.{4,}@)匹配@前第5个字符前的所有字符,replaceAll时当做一个
.(?=.*@)@前的任意字符,匹配范围大,如果调换|的位置:(.(?=.*@)|.+(?=.{4,}@))后半段不生效

String s = v.replaceAll("(.(?=.*@)|.+(?=.{4,}@))", "*"); // **********@qq.com
String s = v.replaceAll("(.(?=.*@))", "*"); // **********@qq.com 和上面一样

例子 邮箱示例 1234567890@qq.com 作者@qq.com @qq.com

String v = "1234567890@qq.com";
// @前全部替换*,且最多5个*
String s = v.replaceAll("(.+(?=.{4,}@)|.(?=.*@))", "*"); // *****@qq.com
// @前的5个替换成1个*,开头多出来的不变
String s = v.replaceAll("(.{5})(?=@)", "*"); // 12345*@qq.com
// @前的5个替换成5个*,开头多出来的不变
String s = v.replaceAll(".(?=.{0,4}@)", "*"); // 12345*****@qq.com
// 保留@前的5个不变,再往前的替换n个*
String s = v.replaceAll(".(?=.{5,}@)", "*");// *****67890@qq.com    //换成一个*的:".+(?=.{5,}@)"

不合适的地方请评论指正
点个赞再走👍

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐