如何利用正则表达式实现对原始 JSON 字符串中敏感字段的正则脱敏

阿浩小哥_1921

阿浩小哥_1921

2026-05-26

536人浏览

原创

直接对原始json字符串用正则脱敏可行但需谨慎:精准匹配键名、安全捕获值、保留格式;须处理跨行、转义、注释等陷阱,并按值类型差异化脱敏。

如何利用正则表达式实现对原始 json 字符串中敏感字段的正则脱敏

直接对原始 JSON 字符串(未解析为对象)用正则表达式脱敏,是可行但需谨慎的方案——适用于无法或不希望解析 JSON 的轻量场景(如日志预处理、网关层快速过滤),但必须避开 JSON 结构陷阱(如嵌套、引号转义、字段名重复等)。核心思路是:**精准匹配键名 + 安全捕获值 + 保留原始格式**。

识别敏感字段的键值对模式

不能简单写 "phone": "138...",因为 JSON 中键名和值可能跨行、含空格、有转义引号。推荐使用惰性匹配 + 带边界的模式:

  • 基础结构:"s*(phone|idCard|email|password)s*"s*:s*("([^"\]|\.)*"|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?)
  • 说明:匹配双引号包裹的敏感键名(忽略周围空白),冒号后允许空白,再匹配字符串(支持转义)、布尔、null 或数字;用非贪婪 [^"\]* 防止跨字符串误匹配
  • 注意:不匹配单引号 JSON(非标准),也不处理键名带转义(如 ""phone""),这类极少,若存在需前置预清理

对不同值类型执行差异化脱敏

值的类型决定脱敏方式,正则需分组捕获并判断:

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载
  • 字符串值(第3组匹配内容):保留开头2位 + "****" + 末尾1位(如 "138****0001");邮箱可留用户名首尾+域名("u***@domain.com")
  • 数字/布尔/null:数字可替换为 0 或 ***;布尔统一为 false;null 保持不变或替为 null
  • 实现提示:在 replace 回调中用 if (match[3]) {...} 判断是否为字符串,避免误脱敏数字

规避 JSON 结构风险的关键细节

原始字符串操作易出错,以下三点必须处理:

  • 跳过注释与字符串内内容:JSON 标准无注释,但实际日志中可能出现 // 或 /* */。若存在,需先移除注释(用正则 //*[sS]*?*/|//.*/g),否则可能把注释里的 "phone" 当成字段脱敏
  • 防止匹配到值中的键名:例如 "content": "user phone: 138..."。通过要求键名前后必须是 " + 空白 + :(即 "s*keys*"s*:)来降低误伤
  • 保留原始缩进与换行:replace 时用 $&(整个匹配)做占位,只替换值部分,确保 JSON 格式不变,利于后续解析或展示

一个可用的 JavaScript 示例

以脱敏 phone、idCard、email 为例:

const sensitiveKeys = ['phone', 'idCard', 'email'];
const pattern = new RegExp(
  '"\s*(' + sensitiveKeys.join('|') + ')\s*"' +      // 匹配键
  '\s*:\s*' +                                        // 冒号及空格
  '(' +                                                // 值(捕获组2)
    '"([^"\\]|\\.)*"' +                            // 字符串(支持转义)
    '|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?' + // 其他字面量
  ')',
  'g'
);
<p>function desensitizeJSON(jsonStr) {
return jsonStr.replace(pattern, (match, key, value) => {
if (value.startsWith('"')) {
const inner = value.slice(1, -1); // 去掉引号
let masked;
if (key === 'phone') masked = inner.length > 4 ? inner.substring(0, 3) + '<strong><strong>' + inner.slice(-1) : '</strong></strong>';
else if (key === 'idCard') masked = inner.length > 16 ? inner.substring(0, 4) + '<strong>****</strong>' + inner.slice(-4) : '<strong>****</strong>';
else if (key === 'email') {
const [user, domain] = inner.split('@');
masked = user ? (user[0] + '<strong><em>@' + (domain || '')) : '</em></strong>@<strong><em>';
}
return <code>"${key}": "${masked}"</code>;
}
return `"${key}": "</em></strong>"`; // 非字符串值统一掩码
});
}</p>

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2135

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3282

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1116

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3759

7

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4376

8

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2023.07.05

2901

4

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8022

9

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

2023.08.11

812

5

正则表达式空格
正则表达式空格

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

520

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习