Регулярное выражение для сопоставления и замены подстроки - PullRequest
0 голосов
/ 07 июня 2019

У нас есть функция регистрации для регистрации всех запросов, и теперь я хочу скрыть некоторые конфиденциальные данные из тела запроса.

string body = null;

using (var reader = new StreamReader(request.InputStream))
{
    request.InputStream.Seek(0L, SeekOrigin.Begin);
    body = reader.ReadToEnd();
}

if (!string.IsNullOrWhiteSpace(body))
{
    _logger.NameValueLogger.Add("body", RemoveSensitiveData(body));
}

Пример содержания тела:

"Id = 12345 & Id = & Name = АСМАП & addressLine1 = 1232 + тест + & addressLine2 = SDF & City = ABCD"

Теперь в RemoveSensitiveData () Я хочу найти Имя и заменить значение имени «TestName» на «*****»

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

Может кто-нибудь предложить лучший подход для решения этой проблемы?

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Это должно сделать это:

string RemoveSensitiveData(string value) => Regex.Replace(value, "((^|&)(Name|OtherSensitiveData)=)[^&]+", m => m.Groups[1].Value + "*****")

редактировать: добавлено (^|&) обеспечить полное совпадение

2 голосов
/ 07 июня 2019

Если вы хотите «замаскировать» некоторый параметр с фиксированным количеством звездочек, вы можете использовать простой Regex.Replace без MatchEvaluator:

string RemoveSensitiveData(string value) => 
    Regex.Replace(value, "((?:&|^)(?:Name|OtherSensitiveData)=)[^&]+", "$1*****")

Если вы планируете заменить на такое же количество звездочекuse

string RemoveSensitiveData(string value) =>
    Regex.Replace(value, "((?:&|^)(?:Name|OtherSensitiveData)=)([^&]+)", m =>
        $"{m.Groups[1].Value}{new String('*', m.Groups[2].Value.Length)}")

Regex details

  • ((?:&|^)(?:Name|OtherSensitiveData)=) - Группа 1:
    • (?:&|^) - сопоставление группы без захваталибо & символ или начало строки (его можно заменить на (?<![^&]))
    • (?:Name|OtherSensitiveData) - группа без захвата, соответствующая либо Name, либо OtherSensitiveData подстрокам
    • = - знак равенства
  • ([^&]+) - Группа 2: любые 1+ символов, кроме &.

См. C # демо:

var value = "Id=12345&Id=&Name=TestName&AddressLine1=1232+test+&AddressLine2=sdf&City=abcd";
Console.WriteLine(Regex.Replace(value, "((?:&|^)(?:Name|OtherSensitiveData)=)[^&]+", "$1*****"));
// => Id=12345&Id=&Name=*****&AddressLine1=1232+test+&AddressLine2=sdf&City=abcd
Console.WriteLine(Regex.Replace(value, "((?:&|^)(?:Name|OtherSensitiveData)=)([^&]+)", m =>
        $"{m.Groups[1].Value}{new String('*', m.Groups[2].Value.Length)}"));
// => Id=12345&Id=&Name=********&AddressLine1=1232+test+&AddressLine2=sdf&City=abcd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...