Научитесь маскировать строку или число с помощью символа маски, за исключением отображения последних 4 символов в конце. Такая маскировка обычно встречается в финансовых приложениях, где мы хотим скрыть номер счета или SSN, чтобы избежать отображения данных NPI(непубличной личной информации).
Если нам необходимо замаскировать данные в файлах журнала, то рассмотрите возможность использования встроенной функции маскирования в logback.
1. Маскировка строки с помощью регулярного выражения
Простейшим решением для маскировки строки, за исключением последних N цифр, является использование регулярного выражения с функцией String.replaceAll(). Функция replaceAll() заменяет каждую совпадающую подстроку заданной строкой замены.
В следующем коде регулярное выражение сопоставляет каждый символ в строке, за исключением последних 4 символов. Мы можем применить это регулярное выражение для любого количества символов. Обратите внимание, что если длина строки меньше 4, исходная строка остается неизменной.
public static String maskString(String input) {if(input == null) {return "NULL";}return input.replaceAll(".(?=.{4})", "x");}
Давайте проверим вышеуказанную функцию.
Assertions.assertEquals("xxxxx6789", maskString("123456789"));Assertions.assertEquals("6789", maskString("6789"));Assertions.assertEquals("789", maskString("789"));Assertions.assertEquals("", maskString("")); //empty stringAssertions.assertEquals("NULL", maskString(null)); //null
2. Маскируйте только буквенно-цифровые символы в строке
Если мы хотим замаскировать отформатированную строку, мы можем соответствующим образом настроить регулярное выражение. Например, следующая функция преобразует только буквенно-цифровые символы в отформатированной строке, за исключением последних 4 символов. Так, если строка является отформатированным номером счета или SSN, она пропускает дефисы в отформатированной строке.
public static String maskString(String input) {if(input == null) {return "NULL";}return input.replaceAll("[^-](?=.{4})", "x");}
Давайте также протестируем указанную выше функцию для форматированных строк.
Assertions.assertEquals("xxx-xxx-7890", maskString("123-456-7890"));Assertions.assertEquals("xxxxx6789", maskString("123456789"));
3. Извлечение и добавление последних 4 символов в замаскированную строку
В этом методе мы можем свободно создавать пользовательскую строку маски, содержащую только символы маски в любом формате. Позже мы добавляем последние 4 символа входной строки в строку маски.
В следующем примере мы используем метод String.repeat(), который создает строку, повторяя себя указанное количество раз. Затем мы добавляем последние 4 символа входной строки.
public static String maskString(String input) {if(input == null) {return "NULL";}int maskLength = input.length() - 4;if(maskLength <= 0)return input; //string less than 4 charsreturn "x".repeat(maskLength) + input.substring(maskLength);}
Давайте проверим вышеуказанную функцию.
Assertions.assertEquals("xxxxx6789", maskString("123456789"));Assertions.assertEquals("789", maskString("789"));Assertions.assertEquals("", maskString("")); //empty stringAssertions.assertEquals("NULL", maskString(null)); //null
Обратите внимание, что для форматированных строк необходимо создать пользовательскую строку форматированной маски в соответствии с требованиями.
4. Заключение
В этом руководстве по строкам Java мы научились маскировать заданную строку с указанным символом маски, за исключением последних 4 символов входной строки. Мы научились маскировать строку с помощью регулярных выражений и путем создания пользовательских масок.