#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
Демонстрация регулярных выражений
Если [
и ]
также может быть частью имени клиента, вы можете исключить их из классов символов.