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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:22:28