Email正则表达式无法处理字符串中多邮箱的问题修复咨询
问题分析
你的代码仅能掩码第一个邮箱,核心原因是使用的正则(^[^@]{3}|(?!^)\\G)[^@]存在局限性:
^[^@]{3}仅匹配字符串开头的前3个非@字符,无法作用于后续邮箱;\G要求匹配从上一次匹配结束的位置连续进行,但第一个邮箱的@之后的内容(空格、其他文本)会中断连续匹配,导致第二个邮箱无法触发匹配规则。
解决方案
我们需要先匹配所有完整的邮箱地址,再对每个邮箱的本地部分(@之前的内容)单独进行掩码处理。以下是修正后的代码:
兼容Java 8及以上版本的实现
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String email = "riyajose@gmail.com your my rosymj@gmail.com"; // 匹配完整邮箱,分组捕获本地部分和域名部分 String emailRegex = "\\b([A-Za-z0-9._%+-]+)@([A-Za-z0-9.-]+\\.[A-Za-z]{2,6})\\b"; Pattern pattern = Pattern.compile(emailRegex); Matcher matcher = pattern.matcher(email); StringBuilder result = new StringBuilder(); while (matcher.find()) { String localPart = matcher.group(1); String domainPart = matcher.group(2); // 掩码本地部分:保留前3个字符,其余替换为* String maskedLocal; if (localPart.length() <= 3) { maskedLocal = localPart; } else { StringBuilder localSb = new StringBuilder(localPart.substring(0, 3)); for (int i = 3; i < localPart.length(); i++) { localSb.append('*'); } maskedLocal = localSb.toString(); } // 替换当前邮箱并追加到结果 matcher.appendReplacement(result, maskedLocal + "@" + domainPart); } // 追加剩余未匹配的文本 matcher.appendTail(result); System.out.println("email : " + email); System.out.println("maskedEmail : " + result.toString()); } }
Java 9+简化实现(使用Lambda替换)
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String email = "riyajose@gmail.com your my rosymj@gmail.com"; String emailRegex = "\\b([A-Za-z0-9._%+-]+)@([A-Za-z0-9.-]+\\.[A-Za-z]{2,6})\\b"; Pattern pattern = Pattern.compile(emailRegex); String maskedEmail = pattern.matcher(email).replaceAll(match -> { String local = match.group(1); String domain = match.group(2); String maskedLocal = local.length() <= 3 ? local : local.substring(0, 3) + "*".repeat(local.length() - 3); return maskedLocal + "@" + domain; }); System.out.println("email : " + email); System.out.println("maskedEmail : " + maskedEmail); } }
效果说明
运行后输出如下:
email : riyajose@gmail.com your my rosymj@gmail.com maskedEmail : riya***@gmail.com your my ros***@gmail.com
内容的提问来源于stack exchange,提问作者Cdac15655482
相关产品推荐
相关产品推荐

