Java正则表达式实现列表元素掩码:仅保留后4位可见
解决字符串列表掩码问题:仅保留最后4位可见
你的需求很明确:对列表中的每个字母数字字符串进行掩码,只保留最后4位,同时要保留列表的["和"]格式。之前的正则表达式过于复杂,且没有针对每个字符串单独处理,导致效果不符合预期,下面给你两种简单可靠的解决思路:
方法一:使用正则表达式(简洁直观)
核心思路是针对每个字符串单独处理,用正则匹配除最后4位之外的所有字符,替换为X。
正则说明
使用正则 .(?=.{4}):
.匹配任意单个字符(?=.{4})是正向预查,确保当前字符后面至少还有4个字符(也就是只替换倒数第4位之前的所有字符)
Java 代码示例
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StringMasking { public static void main(String[] args) { List<String> originalStrings = Arrays.asList( "nG5wnyPVNxS6PbbDNNbRsK5zanG94Et6Q4y74", "GgQoDWqP7KtxXeePyyebu5EnNp8XxPC1odeNv", "GgQoDWqP7KtxXeePyyebu5EnNp8XxPC1o12NN" ); List<String> maskedStrings = originalStrings.stream() .map(str -> { // 处理长度<=4的字符串,避免索引问题 if (str.length() <= 4) { return str; } // 替换除最后4位外的所有字符为X return str.replaceAll(".(?=.{4})", "X"); }) .collect(Collectors.toList()); // 输出符合要求的格式 System.out.println(maskedStrings.toString()); } }
运行后会输出你预期的结果:
["XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX4y74","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdeNv","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX12NN"]
方法二:字符串截取(性能更优)
如果不想用正则,直接通过字符串截取和重复X的方式实现,逻辑更直白,性能也更好:
Java 代码示例
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StringMasking { public static void main(String[] args) { List<String> originalStrings = Arrays.asList( "nG5wnyPVNxS6PbbDNNbRsK5zanG94Et6Q4y74", "GgQoDWqP7KtxXeePyyebu5EnNp8XxPC1odeNv", "GgQoDWqP7KtxXeePyyebu5EnNp8XxPC1o12NN" ); List<String> maskedStrings = originalStrings.stream() .map(str -> { if (str.length() <= 4) { return str; } // 生成对应长度的X,拼接最后4位 return "X".repeat(str.length() - 4) + str.substring(str.length() - 4); }) .collect(Collectors.toList()); System.out.println(maskedStrings.toString()); } }
为什么你之前的正则没生效?
你之前的正则试图一次性匹配整个列表的结构(包含["等符号),但这种方式很难覆盖所有元素的处理,而且正则结构过于复杂,导致只匹配到了部分元素。正确的思路应该是先遍历列表中的每个字符串,单独处理每个字符串的掩码逻辑,再重新组合成列表格式。
内容的提问来源于stack exchange,提问作者Rama Krishna Raju GVSS
相关产品推荐
相关产品推荐

