如何用正则表达式替换JSON中的密码值为***
验证C#正则替换Password字段的方案是否可行
需求回顾
你需要把一段JSON格式字符串里的Password字段值替换为***:
- 原始片段:
Data: {"Account":"d\\adm","Password":"cWExZjEiMTM="},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null} - 预期输出:
Data: {"Account":"d\\adm","Password":"***"},"SqlServer":{"InstanceName":"","MachineName":"MyMachine","Port":null}
你的C#实现代码
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);
方案可行性分析
你的这个方案完全可行,具体原因如下:
- 正则匹配逻辑精准:模式里的
\"Password\":\"(?<pass>[^\"]*)\"(注:你代码里的(?<pass>是HTML转义写法,实际运行时应该是(?<pass>,否则会被当作普通字符处理)会精准定位Password字段,[^\"]*会匹配双引号前的所有密码内容,不会误触其他字段。 - 替换逻辑符合预期:用
"Password":"***"替换匹配到的内容,正好把原始密码值替换成星号。 - 大小写适配:
RegexOptions.IgnoreCase选项确保不管字段名是Password还是小写的password都能被匹配替换,覆盖了大小写不一致的场景。
从你给出的执行结果来看,最终输出也完全符合预期,说明这个方案是有效的。
额外优化建议
如果这段内容是标准JSON,其实用JSON序列化库(比如System.Text.Json或Newtonsoft.Json)来解析修改会更稳妥,能避免JSON格式变化(比如字段顺序调整、出现空格)导致正则匹配失败的情况。举个System.Text.Json的简单示例:
// 先将片段补全为合法JSON var validJson = "{\"Data\":{\"Account\":\"d\\\\adm\",\"Password\":\"cWExZjEiMTM=\"},\"SqlServer\":{\"InstanceName\":\"\",\"MachineName\":\"MyMachine\",\"Port\":null}}"; using var jsonDoc = JsonDocument.Parse(validJson); using var ms = new MemoryStream(); using var writer = new Utf8JsonWriter(ms); writer.WriteStartObject(); foreach (var rootProp in jsonDoc.RootElement.EnumerateObject()) { if (rootProp.Name == "Data") { writer.WriteStartObject("Data"); foreach (var dataProp in rootProp.Value.EnumerateObject()) { if (dataProp.Name.Equals("Password", StringComparison.OrdinalIgnoreCase)) { writer.WriteString("Password", "***"); } else { dataProp.WriteTo(writer); } } writer.WriteEndObject(); } else { rootProp.WriteTo(writer); } } writer.WriteEndObject(); writer.Flush(); var result = Encoding.UTF8.GetString(ms.ToArray());
不过如果只是处理固定格式的片段,你的正则方案已经足够好用啦。
内容的提问来源于stack exchange,提问作者isxaker
相关产品推荐
相关产品推荐

