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

如何在Java中使用Regex获取邮箱用户名首字符及中间字符并实现掩码

邮箱地址掩码处理实现方案

需求说明

需要对邮箱地址的用户名部分做特殊掩码处理:保留首字符和一个中间字符(用户名长度为偶数时,可随机选择中间两个字符中的一个),其余字符用掩码(如*)替换,域名部分保持原样。示例效果如下:

  • 输入:test@gmail.com → 输出:t*s*@gmail.com
  • 输入:helloworld@yahoo.co.in → 输出:h*****w*****@yahoo.co.in
  • 输入:ibibo@hotmail.com → 输出:i**b**@hotmail.com

原正则input.replaceAll("(?<=.{1}).(?=[^@]*?@)","X")会将用户名首字符外的所有内容替换为X,无法满足保留中间字符的需求,需要结合字符串逻辑处理。

实现思路

  1. 按;拆分所有邮箱地址,逐个处理
  2. 对每个邮箱,用@分割出用户名和域名
  3. 根据用户名长度确定保留的中间字符位置:
    • 长度≤2:直接保留原用户名
    • 长度为奇数:取正中间位置的字符
    • 长度为偶数:随机选择中间两个位置中的一个
  4. 拼接掩码后的用户名:首字符 + 前半段掩码 + 保留的中间字符 + 后半段掩码
  5. 组合回完整邮箱,最后用;连接所有处理结果

代码示例(Java)

import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailMasker {
    private static final Random random = new Random();
    private static final Pattern EMAIL_PATTERN = Pattern.compile("([^@;]+)@([^;]+)");

    public static String maskEmails(String input) {
        StringBuilder result = new StringBuilder();
        Matcher matcher = EMAIL_PATTERN.matcher(input);
        
        while (matcher.find()) {
            String username = matcher.group(1);
            String domain = matcher.group(2);
            String maskedUsername = maskUsername(username);
            result.append(maskedUsername).append("@").append(domain).append(";");
        }
        // 移除末尾多余的分号(匹配原输入格式)
        if (result.length() > 0 && result.charAt(result.length() - 1) == ';') {
            result.setLength(result.length() - 1);
        }
        return result.toString();
    }

    private static String maskUsername(String username) {
        int len = username.length();
        if (len <= 2) {
            return username;
        }
        // 确定要保留的中间字符位置
        int middlePos;
        if (len % 2 == 1) {
            middlePos = len / 2;
        } else {
            // 偶数长度随机选中间两个位置之一
            middlePos = len / 2 - 1 + random.nextInt(2);
        }
        // 构建掩码字符串
        StringBuilder masked = new StringBuilder();
        masked.append(username.charAt(0));
        // 首字符到中间位置的掩码
        for (int i = 1; i < middlePos; i++) {
            masked.append("*");
        }
        // 添加保留的中间字符
        masked.append(username.charAt(middlePos));
        // 中间位置到末尾的掩码
        for (int i = middlePos + 1; i < len; i++) {
            masked.append("*");
        }
        return masked.toString();
    }

    public static void main(String[] args) {
        String input = "test@gmail.com; helloworld@yahoo.co.in; ibibo@hotmail.com;";
        String output = maskEmails(input);
        System.out.println(output);
    }
}

核心说明

  • 用正则([^@;]+)@([^;]+)精准匹配每个邮箱的用户名和域名,避免分割错误
  • 针对不同长度的用户名动态计算保留位置,偶数长度加入随机逻辑符合需求
  • 手动拼接掩码字符串,确保首字符和指定中间字符被保留,其余字符统一替换为掩码

内容的提问来源于stack exchange,提问作者sheshadri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:47:25