如何用正则将JSON中含连字符的token/API密钥值替换为空字符串
JSON敏感凭证字段值脱敏方案
需求说明
需要在保留JSON原有结构、字段键名的前提下,清空access_token、Api_key这类敏感凭证字段的取值,不能直接删除整行键值对。
待处理示例JSON:
{ "name":"any name", "access_token":"xxx-xxxxx-1234-45rf", "some_data":"some random data", "Api_key":"1234-cd34-xxx-xxxx" }
最初尝试的正则".*-.*-.*"匹配范围过宽,会把整行键值对全部删除,不符合要求。
期望处理效果:
{ "name":"any name", "access_token":"", "some_data":"some random data", "Api_key":"" }
补充约束:敏感凭证值长度不固定,普遍包含连字符。
可选实现方案
方案1:结构化解析(优先推荐,无匹配误差)
正则直接处理JSON字符串容易因为格式变体(比如键值对前后有多余空格、值里有转义引号、嵌套结构)出现误判,最稳妥的方式是先把JSON反序列化为对象,定位到敏感字段后清空值,再重新序列化为JSON。
以Python实现为例:
import json # 配置需要脱敏的敏感字段集合,匹配时可统一转小写兼容大小写变体 sensitive_key_set = {"access_token", "api_key"} raw_content = '''{ "name":"any name", "access_token":"xxx-xxxxx-1234-45rf", "some_data":"some random data", "Api_key":"1234-cd34-xxx-xxxx" }''' # 解析JSON json_obj = json.loads(raw_content) # 遍历清空敏感字段值 for key in json_obj: if key.lower() in sensitive_key_set: json_obj[key] = "" # 按原有缩进格式输出 result = json.dumps(json_obj, indent=2, ensure_ascii=False) print(result)
这个方案不受敏感值格式、长度影响,不会破坏JSON结构,适合所有可正常解析JSON的场景。
方案2:正则替换(适合无法解析JSON的轻量场景)
如果场景限制无法做JSON结构化解析,可以用分组捕获的正则,只替换值部分,保留键名和JSON结构:
- 匹配正则:
("(?:access_token|api_key|Api_key)"\s*:\s*)"[^"]*" - 替换为:
$1""
正则逻辑说明:
- 第一个捕获组匹配需要完整保留的结构:敏感字段的键名、键名前后的引号、键名和冒号之间的空白、冒号、冒号和值之间的空白
- 捕获组外的部分匹配需要清空的字段值:双引号包裹的所有取值内容,直接替换为空双引号即可
如果后续需要新增其他敏感字段,直接在正则的(?:access_token|api_key|Api_key)分组里补充字段名即可。
注意:正则方案无法完美兼容所有特殊JSON格式,比如值内存在转义双引号、字段嵌套在多层对象中时可能出现匹配偏差,这类情况必须用结构化解析方案处理。
内容的提问来源于stack exchange,提问作者Pravesh
相关产品推荐
相关产品推荐

