Требуется регулярное выражение для получения идентификаторов электронной почты в сообщении об исключении между символами <и> - PullRequest
0 голосов
/ 09 апреля 2019

Требуется помощь по регулярному выражению для получения идентификаторов электронной почты в стеке ошибок, который выглядит как «Некоторый текст, разрыв строки текста и т. Д.».

Попытка с использованием некоторых предложений, представленных в Переполнение стека.Но большинство из них выводит только ошибку

Ниже приведены некоторые из опций, которые я опробовал,

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("<(<^>>+)>")

Массив Actual Resulting String содержит только одно значение и печатает весь стек, как показано ниже,

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: в идентификаторе электронной почты нет \.Переполнение стека не принимает символ, за которым следует <.Так что до этого добавили escape-символ. </p>

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Это прекрасно работает в соответствии с принятым ответом, Регулярное выражение для извлечения текста в квадратных скобках

Pattern.compile("\\<(.*?)\\>").matcher(e.getMessage());
0 голосов
/ 09 апреля 2019

Это должно делать то, что вы хотите, хотя и с допущением, что в каждом сообщении будет только один.

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) для вашего примера (и вы можете отбросить статический), однако вы хотите предоставить рабочий пример.

Любые объяснения необходимы, пожалуйста, спросите. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...