用于匹配和替换子字符串的正则表达式

时间:2019-06-07 16:44:03

标签: c# asp.net .net regex string

我们具有记录所有请求的日志记录功能,现在我想从请求正文中隐藏一些敏感数据。

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 = TestName&AddressLine1 = 1232 + test +&AddressLine2 = sdf&City = abcd”

现在在 RemoveSensitiveData()中,我要搜索名称,并将名称值“ TestName”替换为“ *****”

如果还有其他要与名称一起隐藏的字段,我也必须替换它们。

有人可以建议最好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

这应该做到:

composer install

编辑:添加了string RemoveSensitiveData(string value) => Regex.Replace(value, "((^|&)(Name|OtherSensitiveData)=)[^&]+", m => m.Groups[1].Value + "*****") ,确保完全匹配

答案 1 :(得分:2)

如果您想用固定数量的星号“屏蔽”某些参数,则可以使用不带MatchEvaluator的简单Regex.Replace

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

如果您打算用相同数量的星号替换,请使用

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

正则表达式详细信息

  • ((?:&|^)(?:Name|OtherSensitiveData)=)-第1组:
    • (?:&|^)-与&字符或字符串开头匹配的非捕获组(可以用(?<![^&])替换)
    • (?:Name|OtherSensitiveData)-与NameOtherSensitiveData子字符串匹配的非捕获组
    • =-等号
  • ([^&]+)-第2组:&以外的任意1个以上的字符。

请参见C# demo:

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