Регулярно маскировать все, кроме двух последних цифр числа определенной длины - PullRequest
0 голосов
/ 21 октября 2019

У меня есть строка, в которой я пытаюсь замаскировать ТОЛЬКО 10-значное число, кроме последних двух. Глядя на его регулярном выражении значения в Java для него.

1002 * Для все намерения и цели строки «Godel1234567890Escher753951852456Bach7894561230» должен получить «GodelXXXXXXXX90Escher753951852456BachXXXXXXXX30». 1004 * До сих пор мое регулярное выражение значения str.replaceAll("(?<!\\d)\\d{10}(?!\\d)", XXXXXXXX) Этосмог получить ТОЛЬКО 10 цифр, однако я не могу найти какой-либо способ исключить последние 2 цифры.

Ответы [ 3 ]

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

Вместо сопоставления 10 цифр, сопоставления 8 и 2 цифр, захват 2 цифры и вставка захваченных цифр в заменяющее значение:

str.replaceAll("(?<!\\d)\\d{8}(\\d{2})(?!\\d)", "XXXXXXXX$1")

См. regex101. com для демонстрации.

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

Вот еще один вариант, который, на мой взгляд, проще и более читабелен:

str.replaceAll ("(\\D|\\b)\\d{8}(\\d{2}(\\D|\\b))", "$1XXXXXXXX$2");

Ищите в начале строки либо не цифру, либо границу слова (в данном случае просто начало и конец строки)и конец шаблона, а затем 8 цифр + 2 цифры между ними.

Сохраните все, что соответствует, кроме 8 цифр, и вставьте снова с обратными ссылками.

Я не уверен, как он соотносится с ответом @Andreas, хотя с точки зрения производительности.

С вашим вводом это можно упростить до следующего:

y = x.replaceAll ("(\\D)\\d{8}(\\d{2}(\\D|\\b))", "$1XXXXXXXX$2");
0 голосов
/ 21 октября 2019

Я не уверен, что вы можете сделать это с помощью одного регулярного выражения. Вам может понадобиться более сложный механизм appendReplacment, например:

Pattern p = Pattern.compile("(\\D)\\d{8}(\\d{2})(\\D?)");
Matcher m = p.matcher(aString);
StringBuffer sb = new StringBuffer();

while(m.find())
{
  m.appendReplacement(sb,"$1XXXXXXXX$2$3");
}
m.appendTail(sb);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...