特定格式的数据屏蔽
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
【讨论】:
以上是关于特定格式的数据屏蔽的主要内容,如果未能解决你的问题,请参考以下文章