Является ли Regex стабильным для использования для проверки электронной почты в отличие от класса mailAddress?

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

        TextBox tb = new TextBox();
        tb.KeyDown += new KeyEventHandler(txtEmail_KeyDown);

        string strRegex = @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))";

        Regex re = new Regex(strRegex); // New regex Object  created 

        // Run Checks after the enter is pressed.
        if (e.KeyCode == (Keys.Enter))
        {
            // checks for is match, if empty and length 
            if (!re.IsMatch(txtEmail.Text) || (txtEmail.Text.Equals("")) || txtEmail.Text.Length > 100)
            {
                // display messagebox with error
                MessageBox.Show("Email not correct format!!!! ");
            }
            else
            {
                MessageBox.Show("Email Format is correct");
            }
        }

    }

person whatdoyouNeedFromMe    schedule 16.05.2017    source источник
comment
это зависит от того, какое регулярное выражение вы используете, так как есть так много случаев, чтобы проверить, хотите ли вы ограничить ввод с помощью регулярного выражения   -  person Louis-Roch Tessier    schedule 16.05.2017
comment
было бы более эффективно использовать класс mailAddress? а как насчет приведенного выше примера регулярного выражения, которое также проверяет все tld   -  person whatdoyouNeedFromMe    schedule 16.05.2017
comment
см. там: stackoverflow.com/ вопросы/36035941/   -  person CHS    schedule 16.05.2017


Ответы (2)


вы можете легко проверить с помощью класса EmailAddressAttribute, как это в С#

public bool ValidateEmail(string EmailToVerify)
{
  if (new EmailAddressAttribute().IsValid(EmailToVerify))
        return true;
  else 
        return false;
}

но чтобы использовать это, вам нужно добавить это using вверху вашей кодовой страницы С#

using System.ComponentModel.DataAnnotations;

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

И если вам это нужно, вот ссылка на документ msdn об этом классе: https://msdn.microsoft.com/fr-fr/library/system.componentmodel.dataannotations.emailaddressattribute(v=vs.110).aspx

person Louis-Roch Tessier    schedule 16.05.2017
comment
как я могу реализовать это в рамках проекта формы Windows? - person whatdoyouNeedFromMe; 16.05.2017
comment
посмотри ответ С.Петросова он внедрил - person Louis-Roch Tessier; 16.05.2017

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

ОБНОВЛЕНИЕ 1
После тестирования классов MailAddress и new EmailAddressAttribute().IsValid("MAIL_TEXT_HERE") я пришел к выводу, что проверка EmailAddressAttribute работает лучше.
Вы можете реализовать ее таким образом, допустим, у вас есть TextBox и Button для отправки . Просто добавьте этот обработчик событий Click к кнопкам Click Event:

private void button1_Click(object sender, EventArgs e)
{
    if(!new EmailAddressAttribute().IsValid(textBox1.Text))
    {
        MessageBox.Show("Email is not valid");
    }
    else
    {
        MessageBox.Show("Email is valid");
    }
}
person Samvel Petrosov    schedule 16.05.2017
comment
ура, чтобы написать функцию проверки, я должен использовать класс mailAddress или хранить все возможности в коллекции? - person whatdoyouNeedFromMe; 16.05.2017
comment
@whatdoyouNeedFromMe просто используйте класс MailAddress - person Samvel Petrosov; 16.05.2017
comment
Как бы вы реализовали использование пользовательского ввода из текстового поля на winform - person whatdoyouNeedFromMe; 16.05.2017
comment
не забывайте об использовании, которое вам нужно добавить, как я сказал в своем ответе - person Louis-Roch Tessier; 16.05.2017
comment
@Louis-RochTessier да, конечно, просто VS2017 предлагает добавить его автоматически, так что я не обратил на это внимание, когда писал - person Samvel Petrosov; 16.05.2017
comment
Если ваш ответ касается только стабильности и конкретного механизма регулярных выражений, который действительно реализует конечный автомат, то, возможно, вы правы. Если в то же время вы также обращаетесь к удобству, согласованности, ранее проверенным методам и т. д., то ваш ответ также, вероятно, лучший (т.е. не нужно изобретать велосипед и возиться с поиском идеального шаблона... что само по себе спорно). Однако реализация регулярного выражения .Net не является строго FSM. Также возможно создать решение с несколькими шаблонами, возможно, содержащееся в блоке тайм-аута, которое можно было бы считать стабильным. - person C Perkins; 18.05.2017
comment
@CPerkins да, я с вами согласен, но все это требует дополнительных проверок. - person Samvel Petrosov; 19.05.2017