You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化实现注册报告中字符串密码转全星号的脱敏需求

密码全星号脱敏的优雅实现方法

哈哈,你的原始代码确实有点「蛮力」了——逐个替换每个字符不仅麻烦,还容易出错(比如你每次都用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,提问作者高颜值の美食

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:57:49