繁体   English   中英

单个表达式中的多个正则表达式匹配

[英]Multiple regex matches in single expression

我有以下敏感数据:

"Password":"123","RootPassword":"123qwe","PassPhrase":"phrase"

我想获得以下安全数据:

"Password":"***","RootPassword":"***","PassPhrase":"***"

这是我的代码:

internal class Program
{
    private static void Main(string[] args)
    {
        var data = "\"Password\":\"123\",\"RootPassword\":\"123qwe\",\"PassPhrase\":\"phrase\"";

        var safe1 = PasswordReplacer.Replace1(data);
        var safe2 = PasswordReplacer.Replace2(data);
    }
}

public static class PasswordReplacer
{
    private const string RegExpReplacement = "$1***$2";
    private const string Template = "(\"{0}\":\").*?(\")";

    private static readonly string[] PasswordLiterals =
    {
        "password",
        "RootPassword",
        "PassPhrase"
    };

    public static string Replace1(string sensitiveInfo)
    {
        foreach (var literal in PasswordLiterals)
        {
            var pattern = string.Format(Template, literal);
            var regex = new Regex(pattern, RegexOptions.IgnoreCase);
            sensitiveInfo = regex.Replace(sensitiveInfo, RegExpReplacement);
        }

        return sensitiveInfo;
    }
    
    public static string Replace2(string sensitiveInfo)
    {
       var multiplePattern = "(\"password\":\")|(\"RootPassword\":\")|(\"PassPhrase\":\").*?(\")"; //?
        var regex = new Regex(string.Format(Template, multiplePattern), RegexOptions.IgnoreCase);
        return regex.Replace(sensitiveInfo, RegExpReplacement);
    }
}

Replace1方法按预期工作。 但它会一一完成。 我的问题是是否可以做同样的事情但使用单个正则表达式匹配? 如果是这样,我需要Replace2的帮助。

Replace2看起来像

public static string Replace2(string sensitiveInfo)
{
    var multiplePattern = $"(\"(?:{string.Join("|", PasswordLiterals)})\":\")[^\"]*(\")"; 
    return Regex.Replace(sensitiveInfo, multiplePattern, RegExpReplacement, RegexOptions.IgnoreCase);
}

请参阅C# 演示

multiplePattern将包含类似("(?:password|RootPassword|PassPhrase)":")[^"]*(")的模式,请参阅正则表达式演示。快速详细信息:

  • ("(?:password|RootPassword|PassPhrase)":") - 第 1 组 ( $1 ): 一个"字符后跟passwordRootPasswordPassPhrase然后是一个":" ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ
  • [^"]* - 除了"尽可能多的任何零个或多个字符
  • (") - 第 2 组 ( $2 ):一个"字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM