特定格式的数据屏蔽

时间:2019-10-05 02:39:28

标签: java sql oracle data-masking

给出一个字符串

  

“ 62591000756”

如何对字符串执行屏蔽操作,以使前6个字符和后2个字符以纯文本显示,而其余部分用“ X”替换?例如,

  

“ 625910XXX56”

如何在Java代码和oracle sql中都完成此屏蔽?在这种情况下,有没有可能使用正则表达式的方法? (如上例所示,字符数不限于11)

2 个答案:

答案 0 :(得分:1)

使用替换的另一种方法,在Java中都可用

String text = "62591000756";
String patched = text.substring(0, 6) + "XXX" + text.substring(9);

and sql。它是ansi-sql的一部分,因此它不依赖于您的db品牌。请注意,sql使用基于1的索引,java使用基于0的索引,java使用结束索引,sql使用子字符串的长度。

字符串连接(“ +”)是在SQL中使用CONCAT(也在Ansi标准中)完成的,让我们看看...

SELECT CONCAT(SUBSTRING(Fieldname, 1, 6), "XXX", SUBSTRING(Fieldname, 10, 2)) AS PATCHED FROM
Tablename;

然后是Java regex版本:

"62591000756".replaceAll("([0-9]{6})([0-9]{3})([0-9]{2})", "$1XXX$2")

对于sql版本,取决于您的数据库。有些进行了正则表达式替换,oracle does

如果要泛化此代码以允许在任何索引处使用任何长度的掩码,则可以使用正则表达式方法:只需为正则表达式中的数字设置自定义值({6} {3} {2})类似于String.format("([0-9]{%d})([0-9]{%d})([0-9]{%d})", lenghtPrefix, lengthMask, lengthPostfix)。请注意,您将为此引入很多特殊情况,例如掩码的索引和长度必须在原始字符串的范围内。

我很肯定您可以编写一个可以处理此问题的sql,但是它可能会变得复杂,或者,由于您使用的是Oracle,因此可以为该作业编写一个plsql函数,然后可以在sql中使用它。 Oracle还允许嵌入Java,但是从来没有尝试过。

答案 1 :(得分:0)

在Java中,字符串是不可变的,因此您不能直接修改字符串,但必须使用字符Array或使用StringBuilder。 在使用字符数组的Java中,您可以执行以下代码

    String str="62591000756";
    char[] strChar=str.toCharArray();
    int arrLength=strChar.length;
    for(int i=6;i<arrLength-2;i++){
        strChar[i]='X';
    }
    System.out.println(new String(strChar));

此代码将根据需要输出 625910XXX56