簡體   English   中英

正則表達式匹配和替換子字符串

[英]Regex for match and replace substring

我們具有記錄所有請求的日志記錄功能,現在我想從請求正文中隱藏一些敏感數據。

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”替換為“ *****”

另外,如果還有其他要與名稱一起隱藏的字段,我也必須替換它們。

誰能建議最好的方法來解決這個問題?

應該這樣做:

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

編輯:添加(^|&)確保完全匹配

如果要用固定數量的星號“屏蔽”某些參數,則可以使用不帶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:
    • (?:&|^) - & char或字符串開頭匹配的非捕獲組(可以用(?<![^&])替換)
    • (?:Name|OtherSensitiveData) -與NameOtherSensitiveData子字符串匹配的非捕獲組
    • = -等號
  • ([^&]+) -組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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM