Шаблону регулярных выражений нужна помощь метод Java toString()

#java #regex

#java #регулярное выражение

Вопрос:

У меня есть java toString для кода , сгенерированного из XML. Мы, как компания, записываем toString() в журналы, и у меня возникают проблемы с созданием хорошего регулярного выражения для эффективной маскировки всех данных. Вот пример для строки

 String input="com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=HARVARD LAW SCHOOL, THE, clientId=12345]";
 

ожидаемый результат

 com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=****************, clientId=12345]
 

Может кто-нибудь помочь мне с регулярным выражением, которое будет маскировать все вплоть до последней запятой (,) перед следующим равным =

вот что я попробовал

 maskPatterns.add("clientName=(.*?)=");
 

Это заканчивается маскировкой до следующего = . Кажется, я не могу понять, как заставить его вернуться к последней запятой (,) перед следующим равным (=).

Кроме того, если у кого-нибудь есть лучшее регулярное выражение для этого, я весь внимание

Комментарии:

1. Вероятно, вы можете просто использовать "clientName=([^,]*)" или "clientName=([^,=]*)"

2. внутри имени клиента есть запятая, которая останавливается после первого.

3. Правильно, используйте clientName=(.*?)(?=s*,s*w =|]) . Он будет работать, даже если значения содержат = .

4. (?<=clientName=).*(?=,s*clientId) Поможет ли? Или clientID не всегда присутствует в качестве следующего параметра в вашей строке?

5. ну, в моем случае это toString класса java, так что в конечном итоге это так, но регулярное выражение должно быть независимым от него.

Ответ №1:

Вы можете использовать

 clientName=(.*?)(?=s*,s*w =|])
 

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

Подробные сведения

  • clientName= — литеральная строка
  • (.*?) — Группа 1: любые нулевые или более символов, отличных от символов разрыва строки, как можно меньше
  • (?=s*,s*w =|]) — положительный прогноз, который требует либо ] ( ] или ( | ) запятой, заключенной в ноль или более пробелов на обоих концах ( s*,s* ), затем один или несколько символов word и = сразу справа от текущего местоположения.

Или, если вам нужно такое же количество звездочек, используйте

 String result = text.replaceAll("(\G(?!^)|clientName=).(?=.*?,\s*\w =|\])", "$1*");
 

Посмотрите эту демонстрацию регулярных выражений.

Подробные сведения

  • (\G(?!^)|clientName=)
  • . — любой символ, кроме символа разрыва строки
  • (?=.*?,s*w =|]) — до первого появления
    • .*?,s*w = — любые нулевые или более символов, отличные от символов разрыва строки, как можно меньше, запятая, ноль или более пробелов, один или несколько символов word и =
    • | — или
    • ] ] символ.

Комментарии:

1. Спасибо за объяснение, помогите мне разобраться в тонкостях работы регулярных выражений.

Ответ №2:

Используйте String#replaceAll здесь:

 String input = "com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=HARVARD LAW SCHOOL, THE, clientId=12345]";
String output = input.replaceAll("\bclientName=.*?(\s*)(?=\w =|\])", "clientName=****************$1");
System.out.println(input);
System.out.println(output);
 

Это печатает:

 com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=HARVARD LAW SCHOOL, THE, clientId=12345]
com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=**************** clientId=12345]
 

Обратите внимание, что количество звездочек, вероятно, не должно точно соответствовать количеству исходных символов в clientName . Это фактически означало бы частичное раскрытие исходного содержимого, поскольку оно раскрывало бы, по крайней мере, исходную длину clientName строки.

Комментарии:

1. Мне также нравится ваша идея изменить no of *, и я постараюсь ее включить.

Ответ №3:

Согласно вашему примеру maskPatterns.add("clientName=(.*?)="); , я предполагаю, что вам нужно значение в группе захвата 1.

Если он не зависит от квадратных скобок для обозначения конца значения, но вы также не хотите их сопоставлять, вы можете использовать:

 bclientName=([^rn,=[]] (?:,(?!h*w =)[^rn,=[]]*)*)
 

Объяснение

  • bclientName= Граница слова, затем сопоставьте clientName=
  • ( Группа захвата 1
    • [^rn,=[]] Сопоставьте 1 раз любой символ, кроме , = [ ] или новой строки
    • (?: Не группа захвата
      • ,(?!h*w =) Сопоставьте запятую, утверждающую, что то, что находится прямо справа, не является 0 горизонтальными символами пробелов, 1 символами слов и = знаком
      • [^rn,=[]]* Необязательно сопоставлять любой символ, кроме новой строки , = [ ]
    • )* Закройте группу без захвата и повторите 0 раз, чтобы получить все вхождения запятой
  • ) Закрыть группу 1

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

Если [ и ] также может быть частью имени клиента, вы можете исключить их из классов символов.