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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:23:14