【问题标题】:Regex for match and replace substring用于匹配和替换子字符串的正则表达式
【发布时间】:2019-10-23 04:43:04
【问题描述】:

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

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() 我想搜索 Name 并将名称值“TestName”替换为“*****”

另外,如果有任何其他字段我想与名称一起隐藏,我也必须替换它们。

谁能建议最好的方法来处理这个问题?

【问题讨论】:

  • 我认为你在正确的轨道上。我绝对会学习一些非常基本的正则表达式语法并使用正则表达式。
  • @EdPlunkett 我有几个字段必须从整个应用程序中隐藏,例如: string hiddenFieldsList = "Name|AddressLine1|AccountNumber|BorrowName|CoBorrowName|CheckNumber|CheckAmount";那么有没有更好的方法来代替硬编码到字符串中呢?
  • 你可以用正则表达式来做到这一点,是的。我很高兴您找到了可以为您完成所有工作的人。
  • 正则表达式部分我知道了,我正在将此字符串传递给正则表达式。有没有更好的方法来做到这一点而不是硬编码成字符串?

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


【解决方案1】:

应该这样做:

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

编辑:添加(^|&)确保完全匹配

【讨论】:

  • 不,如果是TestName=something,它可能会过火
  • @WiktorStribiżew ty
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2011-09-02
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多