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

Java中如何正确替换邮箱域名ps.com前的子域前缀

问题根因

你原有代码的正则存在两处逻辑错误:

  1. 将@符号纳入了匹配范围,执行空替换时会直接把@删掉,才会出现john.doe.ps.com的错误结果
  2. 字符类[^.ps]*写法完全不符合预期:该语法代表匹配所有不属于.、p、s三个字符的连续内容,根本无法定位@和ps.com之间的子域段。
正确实现代码

通过捕获组保留邮箱本地段(@前内容)和根域名ps.com,剔除中间所有子域部分即可,兼容多层子域场景,也不会误改本来就是xxx@ps.com格式、或是其他域名的邮箱:

public class EmailDomainFix {
    public static void main(String[] args) {
        final String case1 = "john.doe@ny.ps.com";
        final String case2 = "john.doe@ma.ps.com";
        final String case3 = "bob@multi.level.sub.ps.com";
        final String case4 = "alice@ps.com"; // 符合最终格式无需修改的场景
        final String case5 = "tom@other.com"; // 非ps.com域名无需修改的场景

        // 正则规则说明:
        // ^(.+@) 第一捕获组:匹配从开头到@符号的所有内容,即邮箱本地段+@
        // .+? 非贪婪匹配@和ps.com之间的所有子域内容,兼容多层子域场景
        // (ps\\.com)$ 第二捕获组:匹配字符串结尾的根域名ps.com
        final Pattern pattern = Pattern.compile("^(.+@).+?(ps\\.com)$");

        // 替换时只保留两个捕获组的内容,自动剔除中间子域
        System.out.println(pattern.matcher(case1).replaceAll("$1$2")); // 输出 john.doe@ps.com
        System.out.println(pattern.matcher(case2).replaceAll("$1$2")); // 输出 john.doe@ps.com
        System.out.println(pattern.matcher(case3).replaceAll("$1$2")); // 输出 bob@ps.com
        System.out.println(pattern.matcher(case4).replaceAll("$1$2")); // 输出 alice@ps.com,无改动
        System.out.println(pattern.matcher(case5).replaceAll("$1$2")); // 输出 tom@other.com,无改动
    }
}

批量处理邮箱列表时,直接循环调用上述替换逻辑即可,不需要额外增加分支判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:39:22