java - 特定格式的数据脱敏

标签 java sql oracle data-masking

给定一个字符串

"62591000756"

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

"625910XXX56"

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

最佳答案

另一种使用替换的方法,在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 .

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

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

关于java - 特定格式的数据脱敏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58244925/

相关文章:

mysql sum and count per category append to matching category 行

java - 一次将SQL脚本执行到oracle db中

java - 在 list 中引用新 Activity

java - 程序没有给出所需的输出

Java 项目管理员权限 windows 7

java - 获取oracle.jdbc.driver.LogicalConnection,需要oracle.jdbc.OracleConnection

ORACLE PL/SQL - 授予/撤销权限

java - 如何在小程序中完成java.exe进程?

php - 选择查询未正确返回

SQL 'like' 表达式匹配所有 varchar 值(即没有完成实际过滤)?