Учитывая ваши требования, в частности, скорость не нужна, я бы использовал Mail.MailAddressParser с try / catch. Гарантируется отфильтровать все, что среда выполнения .NET не может распознать как действительный адрес электронной почты, и это намного проще.
Хорошее регулярное выражение, скорее всего, сделает то же самое, но плохое регулярное выражение даст вам ложные срабатывания, ложные отрицания или и то, и другое.
Затраты на производительность при обработке исключений заставили бы меня пойти другим путем, если бы скорость была фактором, но в этом случае, с вашими требованиями, меньшим количеством кода, более читаемым кодом, и это «просто работает», все уравновешивает фактор производительности .
Пояснение:
Я предполагаю, что ваш предполагаемый код будет выглядеть так:
try
{
System.Net.Mail.MailAddress address = new System.Net.Mail.MailAddress(somestring);
}
catch(Exception ex)
{
// handle invalid email addresses here.
}
И моя рекомендация только для этой ситуации. Это преднамеренное исключение из лучших практик не использования исключений, когда другие методы будут работать, и только , предложенных из-за явного утверждения, что производительность не является фактором .