求助:用正则表达式从异常信息及错误栈中提取< >包裹的邮箱地址
从转义的错误信息中提取邮箱地址
我来帮你搞定这个问题!你遇到的核心问题是正则表达式的写法有误,导致无法正确捕获<和>包裹的邮箱地址。咱们一步步来解决:
先分析你之前写法的问题
你尝试的几个正则要么语法错误,要么匹配逻辑不对:
- 第一个正则
\\<([^>]+)\\)最后多了个无关的),应该匹配>才对,所以无法正确结束匹配 - 后面的split写法比如
<(<^>>+)>存在明显的正则语法错误,<^>>这种写法完全不符合正则规则,导致split无法找到任何分割点,只能返回整个错误信息作为唯一元素
正确的解决方案
方案1:使用Matcher(推荐,支持提取多个邮箱)
这是最可靠的方式,能一次性提取所有符合条件的邮箱。正则的核心是准确匹配转义后的<(<)和>(>),然后捕获中间的邮箱内容。
代码示例:
// 你的错误信息示例 String errorMessage = "Failed messages: javax.mail.SendFailedException: Invalid Addresses; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 550 5.0.0 <abc@def.com>... User unknown ; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 550 5.0.0 <def@ghi.com>... User unknown ;"; // 正确的正则表达式:匹配&<;开头,&>;结尾,捕获中间的邮箱 Pattern emailPattern = Pattern.compile("\\<([^>]+)\\>"); Matcher matcher = emailPattern.matcher(errorMessage); // 遍历所有匹配结果 while (matcher.find()) { // group(1)就是捕获到的邮箱地址 System.out.println("提取到的邮箱:" + matcher.group(1)); }
执行后会输出:
提取到的邮箱:abc@def.com 提取到的邮箱:def@ghi.com
正则解释:
\\<:匹配转义后的左尖括号<(需要转义&,所以用\\&)([^>]+):捕获组,匹配任意不是>的字符([^...]是取反匹配),刚好对应邮箱地址\\>:匹配转义后的右尖括号>
方案2:使用split(适合简单场景)
如果一定要用split,可以先按<分割,再对每个分割后的部分按>分割,取第一部分:
String errorMessage = "Failed messages: javax.mail.SendFailedException: Invalid Addresses; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 550 5.0.0 <abc@def.com>... User unknown ; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 550 5.0.0 <def@ghi.com>... User unknown ;"; String[] splitByLt = errorMessage.split("\\<"); // 从索引1开始,因为索引0是第一个&<;之前的内容 for (int i = 1; i < splitByLt.length; i++) { String[] splitByGt = splitByLt[i].split("\\>"); if (splitByGt.length > 0) { System.out.println("提取到的邮箱:" + splitByGt[0]); } }
这个方案也能得到正确结果,但Matcher的方式更直观,且更适合处理多个匹配项的场景。
内容的提问来源于stack exchange,提问作者Giftson David
相关产品推荐
相关产品推荐

