Java中如何正确替换邮箱域名ps.com前的子域前缀
问题根因
你原有代码的正则存在两处逻辑错误:
- 将
@符号纳入了匹配范围,执行空替换时会直接把@删掉,才会出现john.doe.ps.com的错误结果 - 字符类
[^.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
相关产品推荐
相关产品推荐

