如何优化实现注册报告中字符串密码转全星号的脱敏需求
密码全星号脱敏的优雅实现方法
哈哈,你的原始代码确实有点「蛮力」了——逐个替换每个字符不仅麻烦,还容易出错(比如你每次都用s1而不是更新后的replaceString,最后其实只替换了数字9,前面的替换全白做了😂)。
给你几个更优雅的解决方案,轻松实现密码全星号脱敏:
方法一:正则表达式一键替换
正则里的.可以匹配任意单个字符(除了换行符,而密码一般不会包含换行),用replaceAll直接把所有字符替换成*,代码极简:
String s1 = "mypassword"; String maskedPassword = s1.replaceAll(".", "*"); System.out.println(maskedPassword); // 输出:**********
方法二:生成对应长度的星号字符串
如果不想用正则,也可以直接根据原密码的长度,生成相同长度的星号字符串,这个方法效率也很高:
方案A(Java 11+ 推荐)
Java 11新增了String.repeat()方法,一行代码搞定:
String s1 = "mypassword"; String maskedPassword = "*".repeat(s1.length()); System.out.println(maskedPassword); // 输出:**********
方案B(兼容Java 11以下版本)
用StringBuilder循环拼接,或者用Arrays.fill填充字符数组:
// 方式1:StringBuilder String s1 = "mypassword"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < s1.length(); i++) { sb.append('*'); } String maskedPassword = sb.toString(); System.out.println(maskedPassword); // 方式2:Arrays.fill import java.util.Arrays; String s1 = "mypassword"; char[] maskChars = new char[s1.length()]; Arrays.fill(maskChars, '*'); String maskedPassword = new String(maskChars); System.out.println(maskedPassword);
为什么原始方法不合理?
除了代码冗余,你的原始代码还有一个致命问题:每次调用replaceAll时都用的是原始字符串s1,而不是上一次替换后的replaceString。比如你最后一行是s1.replaceAll("9","*"),所以最终结果只会把s1里的9替换成*,前面所有的替换操作都没生效——这完全达不到全脱敏的效果哦!
内容的提问来源于stack exchange,提问作者高颜值の美食
相关产品推荐
相关产品推荐

