【问题标题】:Need Regular Expression to retrieve Email IDs in an Exception Message between the characters < and >需要正则表达式来检索字符 < 和 > 之间的异常消息中的电子邮件 ID
【发布时间】:2019-04-09 14:42:04
【问题描述】:

需要有关正则表达式的帮助以检索错误堆栈中的电子邮件 ID,例如“一些文本,一些文本换行符等等”。

尝试使用堆栈溢出中提供的一些建议。但他们中的大多数只打印错误

以下是我尝试过的一些选项,

Matcher m = Pattern.compile("\\<([^>]+)\\)").matcher(e.getMessage());
while(m.find())
{
    System.out.println(m.group(1));
}
System.out.println(e.getMessage().split("<(<^>>+)>"));

exception.getMessage().split("\\[([^]]+)\\]")
exception.getMessage().split("\\<\"(.*?)\"\\>")
exception.getMessage().split("<(<^>>+)>")

实际结果字符串数组只包含一个值并打印整个堆栈如下,

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
;

PS:邮箱中没有\。堆栈溢出不接受

【问题讨论】:

  • 您为什么要尝试使用拆分和正则表达式?拆分返回一个字符串数组,传递给它的参数就是它删除的参数。
  • @adickinson 实际上我对此很陌生。是的,使用 split 是不合适的。所以改为使用匹配器,它适用于不同的正则表达式。现在将发布答案。谢谢!

标签: java arrays regex string


【解决方案1】:

这应该做你想做的事,尽管假设每条消息只会有一个。

public class someClass {
    private static final Pattern idPattern = Pattern.compile("<.*>");

    public static void main(String[] args) {
        doStuff();
    }

    public static void doStuff(){
        try{
            throwNPE();
        } catch (NullPointerException ex){
            String message = ex.getMessage();
            if(idPattern.matcher(message).matches()){
                System.out.println(getId(message));
            }
        }
    }

    public static String getId(String message){
        String[] messageParts = message.split("<|>");
        if(messageParts.length > 1){
            return messageParts[1];
        }else{
            throw new IllegalArgumentException();
        }
    }

    public static void throwNPE(){
        throw new NullPointerException("<123>");
    }
}

您的示例只需要 doStuff() 和 getId(String) (并且您可以删除静态),但是想提供一个工作示例。

任何必要的解释,请询问。祝你好运!

【讨论】:

  • 感谢您的建议。 ID 会有很多实例,我实际上需要一些简单的东西。请建议我发布的答案是否可以。
【解决方案2】:

根据接受的答案,这可以正常工作, Regular expression to extract text between square brackets

Pattern.compile("\\<(.*?)\\>").matcher(e.getMessage());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多