Как заменить строковые значения на «XXXXX» в java? - PullRequest
4 голосов
/ 29 февраля 2020

Я хочу заменить определенные строковые значения на «XXXX». Проблема в том, что шаблон очень динамичен c и у него не будет фиксированного шаблона во входных данных.

Мои входные данные

https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme

Мне нужно заменить значения userId и пароля на «XXXX».

Мой вывод должен быть -

https://internetbanking.abc.co.uk/personal/logon/login/?userId=XXXX&password=XXXX&reme

Это единственный пример. В других случаях присутствуют только userId и пароль -

userId = 12345678 & password = stackoverflow & RememberID =

Я использую Regex в java для достижения вышеуказанного, но пока не удалось Цените любые рекомендации.

[&]([^\\/?&;]{0,})(userId=|password=)=[^&;]+|((?<=\\/)|(?<=\\?)|(?<=;))([^\\/?&;]{0,})(userId=|password=)=[^&]+|(?<=\\?)(userId=|password=)=[^&]+|(userId=|password=)=[^&]+

PS: Я не эксперт в Regex. Также, пожалуйста, дайте мне знать, если есть какие-либо другие альтернативы для достижения этой цели, кроме Regex.

Ответы [ 5 ]

4 голосов
/ 29 февраля 2020

Это может охватывать оба случая.


String maskUserNameAndPassword(String input) {
    return input.replaceAll("(userId|password)=[^&]+", "$1=XXXXX");
}

String inputUrl1 = 
    "https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme";

String inputUrl2 = 
    "userId=12345678&password=stackoverflow&rememberID=";

String input = "https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme";

String maskedUrl1 = maskUserNameAndPassword(inputUrl1);
System.out.println("Mask url1: " + maskUserNameAndPassword(inputUrl1));

String maskedUrl2 = maskUserNameAndPassword(inputUrl1);
System.out.println("Mask url2: " + maskUserNameAndPassword(inputUrl2));

Выше приведено:

Mask url1: https://internetbanking.abc.co.uk/personal/logon/login/?userId=XXXXX&password=XXXXX&reme
Mask url2: userId=XXXXX&password=XXXXX&rememberID=
3 голосов
/ 29 февраля 2020

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

Function<Map.Entry<String, String>, Map.Entry<String, String>> maskUserPasswordEntries = e ->
        (e.getKey().equals("userId") || e.getKey().equals("password")) ? Map.entry(e.getKey(), "XXXX") : e;
Function<List<String>, Map.Entry<String, String>> transformParamsToMap = p ->
        Map.entry(p.get(0), p.size() == 1 ? "" : p.get(p.size() - 1));

URL url = new URL("https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme");
String maskedQuery = Stream.of(url.getQuery().split("&"))
        .map(s -> List.of(s.split("=")))
        .map(transformParamsToMap)
        .map(maskUserPasswordEntries).map(e -> e.getKey() + "=" + e.getValue())
        .collect(Collectors.joining("&"));
System.out.println(url.getProtocol() + "://" + url.getAuthority() + url.getPath() + "?" + maskedQuery);

Вывод:

https://internetbanking.abc.co.uk/personal/logon/login/?userId=XXXX&password=XXXX&reme=
2 голосов
/ 29 февраля 2020

Просто используйте методы replace / replaceAll из класса String, они поддерживают Charset, а также regex.

String url = "https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme";

url = url.replaceAll("(userId=.+?&)", "userId=XXXX&");
url = url.replaceAll("(password=.+?&)", "password=XXXX&");

System.out.println(url);

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

https://regexr.com

2 голосов
/ 29 февраля 2020

Использование:

(?<=(\?|&))(userId|password)=(.*?)(?=(&|$))
  • (?<=(\?|&)) гарантирует, что ему предшествуют ? или & (но не часть матча)
  • (userId|password)= совпадений userId или password, тогда =
  • (.*?) соответствует любому символу, если следующая инструкция не может быть выполнена
  • (?=(&|$)) гарантирует, что следующий символ либо & или конец строки (но не часть совпадения)

Затем замените на $2=xxxxx (чтобы сохранить userId или password) и выберите replaceAll.

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