如何用正则表达式以固定3个星号部分脱敏电子邮箱地址?
邮箱脱敏:用正则替换中间内容为***
问题描述
需要对电子邮箱地址做脱敏处理:
- @前的用户名:若长度>1,保留首尾字符,中间替换为
***;若长度=1,直接替换为*** - @后的域名:保留首尾字符,中间替换为
***(无论域名长度,哪怕是2个字符也按此规则处理)
解决方案
拆分邮箱为用户名和域名两部分,分别用正则处理后拼接即可。以下是Python和JavaScript的具体实现:
Python 代码
import re def mask_email(email): # 拆分用户名与域名 username, domain = email.split("@") # 处理用户名:长度为1则全替换为***,否则保留首尾 def process_username(match): start, mid, end = match.groups() if start == end and not mid: return "***" return f"{start}***{end}" masked_username = re.sub(r"^(.)(.*)(.)$", process_username, username) # 处理域名:直接保留首尾,中间替换为*** masked_domain = re.sub(r"^(.)(.*)(.)$", r"\1***\3", domain) return f"{masked_username}@{masked_domain}" # 验证示例 test_emails = [ "thisisatestemail@domain.com", "foo@bar.com", "fo@bar.com", "f@bar.com" ] for email in test_emails: print(f"{email} → {mask_email(email)}")
运行输出:
thisisatestemail@domain.com → t***l@d***m foo@bar.com → f***o@b***m fo@bar.com → f***o@b***m f@bar.com → ***@b***m
JavaScript 代码
function maskEmail(email) { const [username, domain] = email.split('@'); // 处理用户名逻辑 const maskedUsername = username.replace(/^(.)(.*)(.)$/, (_, start, mid, end) => { return start === end && mid === '' ? '***' : `${start}***${end}`; }); // 处理域名逻辑 const maskedDomain = domain.replace(/^(.)(.*)(.)$/, '$1***$3'); return `${maskedUsername}@${maskedDomain}`; } // 验证示例 const testCases = [ "thisisatestemail@domain.com", "foo@bar.com", "fo@bar.com", "f@bar.com" ]; testCases.forEach(addr => console.log(`${addr} → ${maskEmail(addr)}`));
正则细节说明
- 用户名匹配正则
^(.)(.*)(.)$:^(.)捕获用户名首字符,(.*)捕获首尾间的所有内容(可空),(.)$捕获用户名尾字符- 当用户名长度为1时,首/尾字符相同且中间内容为空,直接返回
***
- 域名匹配正则
^(.)(.*)(.)$:- 逻辑与用户名一致,无论域名中间长度多少,直接保留首尾替换中间为
***
- 逻辑与用户名一致,无论域名中间长度多少,直接保留首尾替换中间为
边界情况覆盖
- 单字符用户名:
f@bar.com→***@b***m(符合需求) - 双字符用户名:
fo@bar.com→f***o@b***m(符合需求) - 多级域名:
test@sub.domain.co.uk→t***t@s***k(按规则保留整个域名部分的首尾)
内容的提问来源于stack exchange,提问作者DeepBlueSeaArrow
相关产品推荐
相关产品推荐

