Regex соответствует первому адресу электронной почты, который не является указанным адресом электронной почты

У меня есть строка с одним или несколькими адресами электронной почты, я хочу использовать регулярное выражение, чтобы найти первый адрес электронной почты, который не является указанным адресом электронной почты. Например, если моя строка содержит один или несколько адресов электронной почты общей формы [email protected], но также может содержать одно или несколько вхождений определенного адреса электронной почты, точно равного определенному лицу@anotherdomain.com, как я могу найти первый адрес электронной почты соответствует первой форме и не является второй формой? Или, другими словами, мне нужен первый адрес электронной почты, отличный от конкретного лица@anotherdomain.com. Все адреса электронной почты могут быть в любом порядке.


person colinp_1    schedule 22.05.2018    source источник


Ответы (1)


Регулярное выражение для соответствия любому адресу электронной почты: \w+@\w+\.\w{3}.

Затем (после того, как это регулярное выражение только что совпало), вы можете использовать отрицательный просмотр назад, чтобы исключить «запрещенный» адрес, например. (?<!particularperson@anotherdomain\.com).

Таким образом, все регулярное выражение может быть:

\w+@\w+\.\w{3}(?<!particularperson@anotherdomain\.com)

Конечно, неизвестно, поддерживает ли ваш вариант регулярного выражения отрицательный просмотр назад (например, JavaScript не поддерживает), но вы не указали это.

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

Редактировать

Если у вас есть переменная последняя часть (.co, .com и другие), попробуйте немного другой подход.

Вы не можете написать, например. .com? в ретроспективном просмотре, потому что он не допускает переменной длины шаблона.

Вместо этого вы можете поместить отрицательный просмотр назад перед последней частью (что бы это ни было) и проверять только particularperson и anotherdomain (плюс @ и . в нужных местах).

Еще два дополнения:

  • После того, что вы уже поняли, не может быть ни точки, ни слова char, поэтому последняя часть должна быть (?!\.\w).
  • Точно так же все регулярное выражение должно начинаться с \b, чтобы начинаться со слова boudary.

Таким образом, исправленное регулярное выражение может быть:

\b\w+@\w+\.(?<!particularperson@anotherdomain\.)\w{2,3}(?!\.\w)
person Valdi_Bo    schedule 22.05.2018
comment
В моем приложении используются классы RegEx фреймворка .NET, поэтому поддерживаются отрицательные просмотры назад, и ваш ответ работает для меня, спасибо! - person colinp_1; 22.05.2018
comment
Я обнаружил проблему в решении: отрицательный поиск назад заставляет регулярное выражение соответствовать определенному человеку@anotherdomain.co (без трейлинга m), как мне сделать так, чтобы этого не происходило? - person colinp_1; 23.05.2018