特定格式的数据屏蔽

Posted

技术标签:

【中文标题】特定格式的数据屏蔽【英文标题】:Data masking with specific format 【发布时间】:2019-10-05 02:39:28 【问题描述】:

给定一个字符串

“62591000756”

如何对字符串执行掩码,以便前 6 个字符和后 2 个字符以纯文本显示,其余字符替换为 "X" ?例如,

“625910XXX56”

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

【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案1】:

另一种使用replace的方式,在java中都可以使用

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

and sql。它是 ansi-sql 的一部分,因此它不依赖于您的数据库品牌。注意,sql 使用从 1 开始的索引,java 是从 0 开始的,java 使用 end-index,sql 使用子字符串的长度。

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

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

然后是java正则表达式版本:

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

至于sql版本,取决于你的数据库。有些做正则表达式替换,oracle does。

如果您想对其进行泛化以允许在任何索引处使用任何长度的掩码,则可以使用正则表达式方法:只需为正则表达式中的数字设置自定义值 (632)类似String.format("([0-9]%d)([0-9]%d)([0-9]%d)", lenghtPrefix, lengthMask, lengthPostfix)。请注意,您将介绍很多这样做的极端案例,例如掩码的索引和长度必须在原始字符串的范围内。

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

【讨论】:

此方法假设字符串有 11 个字符。如果字符串具有灵活的字符数,可以大于或小于 11 怎么办? 数据库正在使用Oracle【参考方案2】:

在java中字符串是不可变的,所以你不能直接修改字符串,但你必须使用字符数组或者你可以使用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

【讨论】:

以上是关于特定格式的数据屏蔽的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive 视图中屏蔽子字符串

Notification屏蔽特定应用的通知提示

请教一个 AdBlock Plus 屏蔽规则怎么写?

XSLT - 屏蔽数据 - 以其他标签为条件

一个可屏蔽长短链接的网络模块

根据子视图所在的位置从 UIView 中屏蔽特定像素