Я пытаюсь создать регулярное выражение для чтения и определения кодов ошибок smtp в возвращенных письмах, поэтому позже я смогу сопоставить эти коды с базами данных кодов ошибок smtp и перевести с помощью других дружественных сообщений.

Основной ответ на возвращенное письмо выглядит следующим образом (актуальна только строка диагностического кода):

- Diagnostic-Code: smtp; 550-5.1.1 The email account that you tried to reach does...
- Diagnostic-Code: smtp; 553 5.1.2 Unknown mail server. Could not find a mail server...
- Diagnostic-Code: smtp; 550 5.5.0 Requested action not taken: mailbox unavailable...
- Diagnostic-Code: smtp;550 5.5.0 Requested action not taken: mailbox unavailable...
- Diagnostic-Code: smtp; 550-5.1.1 The email account that you tried to reach does not exist...

Это может быть два случая:

1. 550 5.5.0 -->  3 digit number + space + 3 digit number only if followed by a dot.
2. 550-5.1.1 --> 3 digit number + hyphen + 3 digit number only if followed by a dot.

Я пробовал с этим регулярным выражением, но не захватывает первые 3 цифры, а вторые 3 цифры, за которыми следует точка

(?<!\d)(\d+\.){2}(?>\d)

Regex101.com

0
jhuamanchumo 16 Апр 2020 в 03:37

1 ответ

Лучший ответ

Основываясь на ваших данных образца, это регулярное выражение должно делать то, что вы хотите:

(?<=smtp;) ?(\d{3})[ -]((?:\d+\.){2}\d+)

Он ищет строку smtp;, за которой следует необязательный пробел, затем 3 цифры (захваченные в группе 1), пробел или дефис, а затем строку цифр, ., цифры, {{X2} }, цифры (захвачены в группе 2).

Демо на regex101

1
Nick 16 Апр 2020 в 00:47