使用 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 组的(一半)数字。其他部分也发生同样的情况。