0

给定一个字符串

“62591000756”

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

“625910XXX56”

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

4

2 回答 2

1

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

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

和 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 做.

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

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

于 2019-10-05T04:32:57.270 回答
0

在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

于 2019-10-05T04:16:15.023 回答