如何在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,无法满足保留中间字符的需求,需要结合字符串逻辑处理。
实现思路
- 按
;拆分所有邮箱地址,逐个处理 - 对每个邮箱,用
@分割出用户名和域名 - 根据用户名长度确定保留的中间字符位置:
- 长度≤2:直接保留原用户名
- 长度为奇数:取正中间位置的字符
- 长度为偶数:随机选择中间两个位置中的一个
- 拼接掩码后的用户名:首字符 + 前半段掩码 + 保留的中间字符 + 后半段掩码
- 组合回完整邮箱,最后用
;连接所有处理结果
代码示例(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
相关产品推荐
相关产品推荐

