正则表达式通过“定位+替换”实现敏感数据隐藏,如手机号用(d{3})d{4}(d{4})→$1****$2,身份证用(d{6})d{8}([dxx]{4})→$1********$2,中文姓名保留首字其余打星。

正则表达式是实现敏感数据隐藏最常用、最灵活的工具之一,核心在于“定位+替换”:用模式精准匹配要遮蔽的部分,再用固定字符(如*)替代。关键不是写得复杂,而是匹配准确、边界清晰、适配真实数据长度和格式。
手机号中间四位隐藏
国内手机号固定11位,通常保留前3位和后4位,中间4位打星。正则需确保只匹配完整号码,避免误伤其他数字串:
- 推荐写法:
(\d{3})\d{4}(\d{4})—— 两组括号分别捕获开头3位和末尾4位,中间4位被替换 - 替换为:
$1****$2(JS/Java/Python通用) - 注意:若输入含空格或横线(如
138-1234-5678),应先清洗或扩展正则,例如(\d{3})[-\s]?(\d{4})[-\s]?(\d{4})→$1****$3
身份证号出生段隐藏
18位身份证中,第7–14位为出生日期(YYYYMMDD),共8位。常规做法是保留前6位和地区码、后4位校验码,中间8位打星:
- 基础正则:
(\d{6})\d{8}(\w{4})(最后1位可能是X,用\w兼容) - 替换为:
$1********$2 - 更稳妥写法:
(\d{6})\d{8}([\dXx]{4}),显式支持大小写X,避免误匹配
姓名部分脱敏
中文姓名长度不固定(2–4字常见),不能简单截取。常用策略是保留首字,其余用*代替:
- 两字名(如“张三”)→ “张*”:用
(.)(.)→$1* - 三字及以上(如“王小明”“欧阳修远”)→ “王**”“欧阳**”:用
(.)(.+)→$1${'*'.repeat($2.length)}(JS需代码拼接) - 简洁通用版(JS):
name.replace(/(? —— 匹配除第一个字符外的所有字符,直接替换成<font color="red">*</font>
JSON内字段自动掩码
日志或调试输出中,常需隐藏"password""pwd""token"等键对应的值:
- 匹配模式:
"(?i)([a-z0-9_]*password|pwd|token)"\s*:\s*"([^"]*)" - 替换为:
"$1":"********"(?i表示忽略大小写) - 注意:必须加
\s*适配空格和换行,否则在格式化JSON中容易失效











