文
章
目
录
章
目
录
学习使用掩码字符来掩码字符串或数字,除非在末尾显示最后 4 个字符。这种屏蔽通常出现在金融应用程序中,我们希望屏蔽帐号或 SSN 以避免显示 NPI(非公开个人信息)数据。
如果我们需要屏蔽日志文件中的数据,请考虑使用logback 中内置的屏蔽功能。
1. 使用正则表达式
屏蔽字符串(最后 N 位数字除外)的最简单解决方案是使用正则表达式和String.replaceAll()函数。ReplaceAll ()函数用给定的替换字符串替换每个匹配的子字符串。
在以下代码中,正则表达式匹配字符串中除最后 4 个字符之外的每个字符。我们可以将此正则表达式应用于任意数量的字符。注意,如果字符串长度小于4,则原字符串保持不变。
public static String maskString(String input) {
if(input == null) {
return "NULL";
}
return input.replaceAll(".(?=.{4})", "x");
}
让我们测试一下上面的函数。
Assertions.assertEquals("xxxxx6789", maskString("123456789"));
Assertions.assertEquals("6789", maskString("6789"));
Assertions.assertEquals("789", maskString("789"));
Assertions.assertEquals("", maskString("")); //empty string
Assertions.assertEquals("NULL", maskString(null)); //null
如果我们想屏蔽格式化字符串,我们可以相应地调整正则表达式。例如,以下函数将仅转换格式化字符串中除最后 4 个字符之外的字母数字字符。因此,如果字符串是格式化的帐号或 SSN,它会跳过格式化字符串中的连字符。
public static String maskString(String input) {
if(input == null) {
return "NULL";
}
return input.replaceAll("[^-](?=.{4})", "x");
}
让我们也测试一下格式化字符串的上述函数。
Assertions.assertEquals("xxx-xxx-7890", maskString("123-456-7890"));
Assertions.assertEquals("xxxxx6789", maskString("123456789"));
2. 将最后 4 个字符附加到自定义屏蔽字符串
在此方法中,我们可以自由创建仅包含任何格式的掩码字符的自定义掩码字符串。随后,我们将输入字符串的最后 4 个字符附加到掩码字符串中。
在下面的示例中,我们使用String.repeat()方法通过重复指定的次数来创建字符串。然后我们附加输入字符串的最后 4 个字符。
public static String maskString(String input) {
if(input == null) {
return "NULL";
}
int maskLength = input.length() - 4;
if (maskLength <= 0)
return input; //string less than 4 chars
return "x".repeat(maskLength) + input.substring(maskLength);
}
让我们测试一下上面的函数。
Assertions.assertEquals("xxxxx6789", maskString("123456789"));
Assertions.assertEquals("789", maskString("789"));
Assertions.assertEquals("", maskString("")); //empty string
Assertions.assertEquals("NULL", maskString(null)); //null
请注意,对于格式化字符串,我们必须根据要求创建自定义格式化掩码字符串。
三、结论
在本 Java 字符串教程中,我们学习了使用指定的掩码字符来掩码给定的字符串(输入字符串的最后 4 个字符除外)。我们学习了使用正则表达式和创建自定义掩码来掩码字符串。