You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式以固定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:33:20