Маскировка данных в определенном формате - PullRequest
0 голосов
/ 05 октября 2019

Учитывая строку

"62591000756"

как я могу выполнить маскирование строки таким образом, чтобы первые 6 символов и последние 2 символа отображались в виде простого текстаа остальное заменено на "Х"? Например,

"625910XXX56"

Как можно выполнить эту маскировку как в Java-коде, так и в Oracle Oracle? Есть ли возможный способ использования регулярных выражений в этом случае? (Количество символов не ограничено 11, как показано в примере выше)

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Другой способ использования замены, доступный как в java

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

, так и в sql . Это часть ansi-sql, поэтому она не зависит от вашей марки БД. Обратите внимание, 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:

"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, но никогда не пробовал.

0 голосов
/ 05 октября 2019

В строке 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

...