【问题标题】:Regex to replace all password with ***正则表达式用 *** 替换所有密码
【发布时间】:2020-06-12 16:43:05
【问题描述】:

我有以下 json:

Data: {"Account":"d\\adm","Password":"cWExZjEiMTM="},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null}

我想使用 RegExp 将密码值替换为 ***。

cWExZjEiMTM= => ***

在我的示例中,我期待以下输出:

Data: {"Account":"d\\adm","Password":"***"},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null

我只有以下解决方案:

string invokeSpec = "\":{\"Account\":\"d\\\\adm\",\"password\":\"cWExZjEiMTM=\"},\"SqlServer\":{\"InstanceName\":\"\",\"MachineName\":\"MyMachine\",\"Port\":null}";
var pattern = "\\\"Password\\\":\\\"(?<pass>[^\\\"]*)\\\"";
var replaced = Regex.Replace(invokeSpec, pattern, "\"Password\":\"***\"", RegexOptions.IgnoreCase); 

":{"Account":"d\\adm","Password":"***"},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null}

【问题讨论】:

  • 使用 JSON 解析器。不要尝试使用正则表达式解析 JSON。
  • @Amy 我必须在进入反序列化模块之前记录所有内容
  • 我不明白这个问题到底是什么。看来您已经有了一个可行的解决方案。那么,您对有效答案有何期望?
  • 您可以使用 JObject.Parse 将其解析为对象。然后你可以尝试修改它。
  • @Dialectus 我正在寻找仅替换密码值。现在我要替换"Password":"Value"。我的意思是我想从我的替换文字中踢"Password"

标签: c# regex replace


【解决方案1】:

我建议用JObject代替Password

var jObject = JObject.Parse(jsonString);
jObject["Password"] = "*****";
Console.WriteLine(jObject.ToString()); //save this value to log

【讨论】:

  • 虽然这行得通,尽管它更清晰,但它可能不符合 OP 的性能或其他上下文要求。该问题要求使用正则表达式解决方案,这更适合作为指向良好实践的评论。
  • @Kilazur 这是 OP 可以选择的答案而不是实际答案。 Krishna 回答了 OP 或许应该提出的问题。
  • @Dialectus 我同意这种观点,但这仍然不是被问到的问题。此外,OP 确实评论说他需要在 Regex 中执行此操作;也许实际上并非如此,但我们没有足够的上下文来说明这一点,并且要获得足够的上下文,它可能确实需要一个全新的问题。再说一次,我没有参加这场比赛的马,只是想指出一些礼仪。
【解决方案2】:

正如人们在评论中所说,如果可以,请使用 JSON 解析器而不是正则表达式。但让我们忽略这一点,因为这不是问题所在。

您正在捕获输入的错误部分。你想要的是substitution

string invokeSpec = "\":{\"Account\":\"d\\\\adm\",\"password\":\"cWExZjEiMTM=\"},\"SqlServer\":{\"InstanceName\":\"\",\"MachineName\":\"MyMachine\",\"Port\":null}";
var pattern = "(\\\"password\\\":\\\")[^\\\"]*(\\\")";
var replaced = Regex.Replace(invokeSpec, pattern, "$1***$2", RegexOptions.IgnoreCase);

如您所见,我们正在捕获两个组,即密码所在的部分。所以,正则表达式有 3 个部分:

  • (\\\"password\\\":\\\") => 密码左侧部分
  • [^\\\"]* => 密码本身(请注意,在您的示例中,您可以将其替换为非贪婪的 .*?
  • (\\\") => 密码右侧部分

我们在替换方法中用$1$2 引用它们,用*** 替换原始密码。

【讨论】:

  • 我的密码是base64格式,所以.*?不起作用
  • 为什么是@isxaker? . 匹配任何字符,*? 匹配直到匹配正则表达式的下一部分。 base64 字符串不包含反斜杠,反斜杠是模式右侧部分的第一个字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多