Соответствие адресу электронной почты, только если отсутствует известный префикс - PullRequest
3 голосов
/ 30 апреля 2019

Я пишу выражение регулярного выражения для соответствия адресам электронной почты, но только если определенный префикс отсутствует перед электронным письмом.(Похоже, это применимо к любому не-литеральному сопоставителю строк после отрицательного lookbehind.)

Я пытался использовать отрицательный lookbehind, но только успешно удалось не сопоставить первый символ адреса электронной почты, если присутствует префикс.

(?<!From: )([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

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

То, что я хотел, чтобы это соответствовало, это адреса электронной почты, если префикс "From: " отсутствует перед ним.

Это не должно совпадать с адресом

18.4.2019 9:35:02.115(22)->:From: address@subdomain.domain.tld

Это должно совпадать с адресом

RCPT TO:<address@domain.tld>

То, что я пробовал, делает правильное совпадение с адресами электронной почты без префикса, но в случае префикса это тоже совпадает с ними, кромепервая буква, которая, видимо, единственная, которая соответствует отрицательному взгляду сзади.Это имеет смысл.

Есть ли способ заставить отрицательный взгляд позади применить ко всей группе захвата?Или к этому следует подходить с другим выражением?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

В движке регулярных выражений в C # (также в других движках) разрешены нефиксированные протяженности вида, поэтому вам просто нужно немного изменить регулярное выражение, изменить внешний вид:

(?<!From: .*)

Демо

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

Другой вариант - сопоставить то, что вам не нужно, и захватить то, что вы хотите, используя чередование :

what you do not want|(what you do want)

Ваш шаблон может выглядеть так:

From: [a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+|([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

Regex demo

...