Регулярное выражение для маскировки данных - PullRequest
2 голосов
/ 01 мая 2019

Я пытаюсь реализовать регулярное выражение для ответа JSON на конфиденциальные данные.

JSON-ответ приходит с AccountNumber и AccountName.

Подробности маскировки приведены ниже.

accountNumber Before: 7835673653678365
accountNumber Masked: 783567365367****

accountName Before : chris hemsworth
accountName Masked : chri* *********

Я могу сопоставить выше, если я просто сделаю [0-9]{12} и (?![0-9]{12}), когда я заменяю это, оно заменяется только на *, но мое регулярное выражение не выдает правильный вывод.

Как я могу произвести вывод, как указано выше, из регулярного выражения?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Если вы соответствуете [0-9]{12} и заменяете его непосредственно одной звездочкой, у вас остается accountNumber Before: *8365

В списке нет языка программирования, но можно использовать один вариант для замены цифр в концеположительный взгляд за утверждением того, что слева - 12 цифр, за которым следует положительный взгляд, чтобы подтвердить то, что справа - 0+ цифр, за которыми следует конец строки.

Затем при замене используйте *

Если значение json точно соответствует значениям chris hemsworth и 7835673653678365, вы можете опустить положительные подсказки (?=\d*$) и (?=[\w ]*$), которые утверждают конец строки для следующих 2 выражений.

Используйте версии с положительным прогнозом, если сопоставляемые данные находятся в конце строки, а строка содержит больше данных, поэтому вы не заменяете больше совпадений, чем ожидаете.

(?<=[0-9]{12})(?=\d*$)\d

В Java:

(?<=[0-9]{12})(?=\\d*$)\\d
  • (?<=[0-9]{12}) Положительный взгляд сзади, утверждают, что слева 12 цифр
  • (?=\d*$) Положительный взгляд вперед, утверждают, что насправа находятся 0+ цифр и утверждается конец строки
  • \d Соответствует одной цифре

Regex demo

Результат:

783567365367 ****

Для имени учетной записи вы можете сделать это с 4-мя символами \w, но это также заменит пробел звездочкой, потому что ясчитаю, что вы не можете пропустить сопоставление этого пробела в одном регулярном выражении.

(?<=[\w ]{5})(?=[\w ]*$)[\w ]

В Java

(?<=[\\w ]{4})(?=[\\w ]*$)[\\w ]

демонстрационное выражение Regex

Результат

chri ***********

0 голосов
/ 01 мая 2019

Если все, что вам нужно, это замаскировать символы, кроме первых N символов, не думайте, что вы действительно сложное регулярное выражение.Для игнорирования первых N символов и замены каждого последующего символа на *, вы можете написать общее регулярное выражение, подобное этому,

(?<=.{N}).

, где N может быть любым числом, например 1,2,3 и т. Д., И заменитьсовпадение с *

Способ работы этого регулярного выражения заключается в том, что он выбирает каждый символ, имеющий перед собой как минимум N символов, и, следовательно, после выбора символа все следующие символы также выбираются.

Например, в вашем AccountNumber случае, N = 12, следовательно, ваше регулярное выражение становится,

(?<=.{12}).

Демонстрация регулярных выражений для маскировки AccountNumber

Java-код,

String s = "7835673653678365";
System.out.println(s.replaceAll("(?<=.{12}).", "*"));

Печать,

783567365367****

И для AccountName случая, N = 4, следовательно, ваше регулярное выражение становится,

(?<=.{4}).

Regex Demo для маскирования имени учетной записи

Java-код,

String s = "chris hemsworth";
System.out.println(s.replaceAll("(?<=.{4}).", "*"));

Печать,

chri***********
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...