需要正则表达式才能在异常消息中检索字符<和>之间的电子邮件 ID



需要有关正则表达式的帮助才能在错误堆栈中检索电子邮件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:电子邮件ID中没有\,堆栈溢出不接受后跟<字符。所以在此之前添加了转义字符。>

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

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(作为你的示例(你可以删除静态(,但是想提供一个工作的例子。

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

根据接受的答案,这工作正常,用于提取方括号之间的文本的正则表达式

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

最新更新