使用 Java 屏蔽不同长度的字符串数据部分
Mask part of the String data which is of different lengths using Java
我需要为我的应用程序屏蔽 PII 数据。 PII 数据将是字符串格式和可变长度,因为它可能包括姓名、地址、邮件 ID 等。
所以我需要在记录它们之前屏蔽这些数据,它不应该是一个完整的屏蔽,如果字符串的长度小于或等于 8 个字符,那么用 "XXX etc.."[ 屏蔽前半部分=11=]
如果长度超过 8,则屏蔽字符串的第一部分和最后一部分,以便只有中间 5 个字符可见。
我知道我们可以使用 java 子字符串和迭代字符串来做到这一点,但想知道是否有任何其他简单的解决方案来解决这个问题。
提前致谢
如果您使用的是 Apache Commons,您可以这样做
String maskChar = "*";
//number of characters to be masked
String maskString = StringUtils.repeat( maskChar, 4);
//string to be masked
String str = "FirstName";
//this will mask first 4 characters of the string
System.out.println( StringUtils.overlay(str, maskString, 0, 4) );
您可以在生成 maskString
之前使用 if else 语句检查字符串长度。
您可以使用该功能;根据您的需要更改一半的逻辑:
public static String maskedVariableString(String original)
{
String maskedString = null;
if(original.length()<9)
{
int half = original.length()/2;
StringBuilder sb =new StringBuilder("");
for(int i=0;i<(original.length()-half);i++)
{
sb.append("X");
}
maskedString = original.replaceAll("\b.*(\d{"+half+"})", sb.toString()+"");
}
else
{
int maskLength = original.length()-5;
int firstMaskLength = maskLength/2;
int secondMaskLength = maskLength-firstMaskLength;
StringBuilder sb =new StringBuilder("");
for(int i=0;i<firstMaskLength;i++)
{
sb.append("X");
}
String firstMask = sb.toString();
StringBuilder sb1 =new StringBuilder("");
for(int i=0;i<secondMaskLength;i++)
{
sb1.append("X");
}
String secondMask = sb1.toString();
maskedString = original.replaceAll("\b(\d{"+firstMaskLength+"})(\d{5})(\d{"+secondMaskLength+"})", firstMask+""+secondMask);
}
return maskedString;
}
说明:
- () 对正则表达式进行分组,我们可以使用 $ 来访问该组($1, $2,$3).
- \b 边界有助于检查我们是否是数字的开头(还有其他方法可以做到这一点,但这里可以)。
- (\d{+half+}) 捕获第 1 组的(一半)数字。其他部分也发生同样的情况。
我需要为我的应用程序屏蔽 PII 数据。 PII 数据将是字符串格式和可变长度,因为它可能包括姓名、地址、邮件 ID 等。
所以我需要在记录它们之前屏蔽这些数据,它不应该是一个完整的屏蔽,如果字符串的长度小于或等于 8 个字符,那么用 "XXX etc.."[ 屏蔽前半部分=11=]
如果长度超过 8,则屏蔽字符串的第一部分和最后一部分,以便只有中间 5 个字符可见。 我知道我们可以使用 java 子字符串和迭代字符串来做到这一点,但想知道是否有任何其他简单的解决方案来解决这个问题。 提前致谢
如果您使用的是 Apache Commons,您可以这样做
String maskChar = "*";
//number of characters to be masked
String maskString = StringUtils.repeat( maskChar, 4);
//string to be masked
String str = "FirstName";
//this will mask first 4 characters of the string
System.out.println( StringUtils.overlay(str, maskString, 0, 4) );
您可以在生成 maskString
之前使用 if else 语句检查字符串长度。
您可以使用该功能;根据您的需要更改一半的逻辑:
public static String maskedVariableString(String original)
{
String maskedString = null;
if(original.length()<9)
{
int half = original.length()/2;
StringBuilder sb =new StringBuilder("");
for(int i=0;i<(original.length()-half);i++)
{
sb.append("X");
}
maskedString = original.replaceAll("\b.*(\d{"+half+"})", sb.toString()+"");
}
else
{
int maskLength = original.length()-5;
int firstMaskLength = maskLength/2;
int secondMaskLength = maskLength-firstMaskLength;
StringBuilder sb =new StringBuilder("");
for(int i=0;i<firstMaskLength;i++)
{
sb.append("X");
}
String firstMask = sb.toString();
StringBuilder sb1 =new StringBuilder("");
for(int i=0;i<secondMaskLength;i++)
{
sb1.append("X");
}
String secondMask = sb1.toString();
maskedString = original.replaceAll("\b(\d{"+firstMaskLength+"})(\d{5})(\d{"+secondMaskLength+"})", firstMask+""+secondMask);
}
return maskedString;
}
说明:
- () 对正则表达式进行分组,我们可以使用 $ 来访问该组($1, $2,$3).
- \b 边界有助于检查我们是否是数字的开头(还有其他方法可以做到这一点,但这里可以)。
- (\d{+half+}) 捕获第 1 组的(一半)数字。其他部分也发生同样的情况。