Проверка электронной почты Regex


216

Я использую это

@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"

регулярное выражение для проверки электронной почты

([\w\.\-]+)- это для домена первого уровня (много букв и цифр, также точки и дефисы)

([\w\-]+)- это для домена второго уровня

((\.(\w){2,3})+)- и это для доменов других уровней (от 3 до бесконечности), которые включают точку и 2 или 3 литералы

что не так с этим регулярным выражением?

РЕДАКТИРОВАТЬ: он не соответствует электронной почте "thing@someth.ing "


1
Кроме того, что вы не включаете допустимые символы, как указано в RFC 5321 и 5322 - ничего.
Брэд Кристи


Я думаю, что вы должны сказать нам, что не так, и тогда другие здесь могут помочь вам исправить неправильную вещь.
Уве Кейм

10
У вас есть проблема -> вы думаете 'regex' -> теперь у вас есть 2 проблемы ;-)
Якуб Конецки

1
Просто комментарий о вашем регулярном выражении. С этими новыми доменами .amsterdam, .info и другими доменами регулярное выражение должно быть:@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,})+)$""
Ton Snoei

Ответы:


373

TLD, такие как .museum , не сопоставляются таким образом, и есть несколько других длинных TLD. Кроме того, вы можете проверить адреса электронной почты, используя класс MailAddress, как Microsoft объясняет здесь в примечании:

Вместо использования регулярного выражения для проверки адреса электронной почты вы можете использовать класс System.Net.Mail.MailAddress. Чтобы определить, является ли адрес электронной почты действительным, передайте адрес электронной почты в конструктор класса MailAddress.MailAddress (String).

public bool IsValid(string emailaddress)
{
    try
    {
        MailAddress m = new MailAddress(emailaddress);

        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

Это избавит вас от головной боли, потому что вам не нужно писать (или пытаться понять чужое) регулярное выражение.


63
Это не поймало двойные точки "..", ни встроенные пробелы ".". Вместо этого я пойду с регулярным выражением
Бенни Скогберг

33
Несмотря на это популярный ответ. Это неправильно, не удается отловить как минимум два неверных формата: «Abc. @ Example.com», «Abc..123 @ example.com»
sean717

12
@ sean717: см. RFC и / или ссылку . Я согласен, что ваши примеры, вероятно, не будут работать в реальном мире, но это не делает их недействительными.
Дэн Пичельман

13
Работает ли он или не использует try catch для проверки ввода, не рекомендуется. Regex, безусловно, лучший путь.
MRT

159
-1 Плохой кусок кода. Поймать исключение - это не способ проверки полей.
ken2k

99

Я думаю, что @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"должно работать.
Вам нужно написать это как

string email = txtemail.Text;
Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
Match match = regex.Match(email);
if (match.Success)
    Response.Write(email + " is correct");
else
    Response.Write(email + " is incorrect");

Имейте в виду, что это не удастся, если:

  1. После @символа есть поддомен .

  2. Вы используете TLD длиной более 3, например .info


2
Возвращает test@-online.com как действительный. Должен быть недействительным.
Матиас Ф

7
Я полагаю, что это не удастся для новых ДВУ, которые выдаются, поскольку у вас теперь могут быть ДВУ с более чем 3 символами.
AaronLS

Это регулярное выражение допустимо для somename@gmail.com.in.in.in.in.
Любопытство

14
gmail.com.in.in.in.in - это абсолютно правильное доменное имя, поэтому я не понимаю, почему его нельзя разрешить?
Larsw

Согласитесь с @larsw регулярное выражение не должно использоваться
Борис Соколов

68

У меня есть выражение для проверки адресов электронной почты, которые я использую.

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

@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
+ "@"
+ @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$";

Для получения дополнительной информации читайте об этом здесь: C # - Регулярное выражение электронной почты

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

Затем существуют одноразовые домены, такие как Mailinator.com и тому подобное. Это не делает ничего, чтобы проверить, является ли электронная почта от одноразового домена или нет.


Это то, что я искал - спасибо! Принимает как двойные точки "..", так и пробелы ".".
Бенни Скогберг

5
Я обновил свой проект регулярных выражений, чтобы у него были модульные тесты, и я даже исправил несколько ошибок: C # - Регулярное выражение электронной почты rhyous.com/2010/06/15/csharp-email-regular-expression
Rhyous

С новыми TLD нам, возможно, следует заменить [a-zA-Z] {2,4} в третьей строке на {0}, а затем выполнить string.format (pattern, pipeSeparatedAllowedTlds), где pipeSeparatedAllowedTlds должен быть создан итерация по этому файлу: data.iana.org/TLD/tlds-alpha-by-domain.txt
Rhyous

12
Parth. Можете ли вы сказать мне, какое правило RFC нарушено вашей электронной почтой? Потому что угадай что. Согласно RFC, это действительно !!!! Если вы купили URL в .in, вы можете создать этот адрес электронной почты. Понять?
Rhyous

2
На самом деле, похоже, что я уже обновил это на своем github здесь: github.com/rhyous/EmailRegEx . Однако \ w может содержать подчеркивания, поэтому мне, возможно, придется отредактировать его для точности.
Rhyous

36

Я нашел хороший документ на MSDN для этого.

Как: убедиться, что строки имеют допустимый формат электронной почты http://msdn.microsoft.com/en-us/library/01escwtf.aspx (убедитесь, что этот код также поддерживает использование не-ASCII символов для имен доменов в Интернете. )

Существует две реализации: для .Net 2.0 / 3.0 и для .Net 3.5 и выше.
версия 2.0 / 3.0:

bool IsValidEmail(string strIn)
{
    // Return true if strIn is in valid e-mail format.
    return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); 
}

Мои тесты по этому методу дают:

Invalid: @majjf.com
Invalid: A@b@c@example.com
Invalid: Abc.example.com
Valid: j..s@proseware.com
Valid: j.@server1.proseware.com
Invalid: js*@proseware.com
Invalid: js@proseware..com
Valid: ma...ma@jjf.co
Valid: ma.@jjf.com
Invalid: ma@@jjf.com
Invalid: ma@jjf.
Invalid: ma@jjf..com
Invalid: ma@jjf.c
Invalid: ma_@jjf
Invalid: ma_@jjf.
Valid: ma_@jjf.com
Invalid: -------
Valid: 12@hostname.com
Valid: d.j@server1.proseware.com
Valid: david.jones@proseware.com
Valid: j.s@server1.proseware.com
Invalid: j@proseware.com9
Valid: j_9@[129.126.118.1]
Valid: jones@ms1.proseware.com
Invalid: js#internal@proseware.com
Invalid: js@proseware.com9
Invalid: js@proseware.com9
Valid: m.a@hostname.co
Valid: m_a1a@hostname.com
Valid: ma.h.saraf.onemore@hostname.com.edu
Valid: ma@hostname.com
Invalid: ma@hostname.comcom
Invalid: MA@hostname.coMCom
Valid: ma12@hostname.com
Valid: ma-a.aa@hostname.com.edu
Valid: ma-a@hostname.com
Valid: ma-a@hostname.com.edu
Valid: ma-a@1hostname.com
Valid: ma.a@1hostname.com
Valid: ma@1hostname.com

1
Не соответствует[me]@whatever.museum
Тото

Неверно: Abc.example.com ДА, это работает правильно, однако, это "toms.email. @ Gmail.com"; не работает
Том Стиккель

1
Пришлось добавить знак плюс: `@" ^ ([\ w - \. +] +) @ (([[0-9] {1,3} \. [0-9] {1,3} \. [0-9] {1,3} \) |. (. ([\ ш -] + \) +)) ([A-Za-Z] {2,4} | [0-9] {1, 3}) (]?) $ "` 11 символ оставлен включенным] Псевдонимы Google и Hotmail позволяют использовать знак плюса в первом разделе перед знаком @.
Henk J Meulekamp

Это то же самое, что и выше. разрешение "somename@gmail.com.in.in.in" в качестве действительного адреса электронной почты ... !!
Любопытство

9
@ParthTrivedi Почему вы настаиваете, что somename@gmail.com.in.in.inэто недействительный адрес электронной почты?
Ивайло Славов

15

Следующий код основан на реализации аннотаций данных Microsoft на github, и я думаю, что это наиболее полная проверка для электронных писем:

public static Regex EmailValidation()
{
    const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";
    const RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture;

    // Set explicit regex match timeout, sufficient enough for email parsing
    // Unless the global REGEX_DEFAULT_MATCH_TIMEOUT is already set
    TimeSpan matchTimeout = TimeSpan.FromSeconds(2);

    try
    {
        if (AppDomain.CurrentDomain.GetData("REGEX_DEFAULT_MATCH_TIMEOUT") == null)
        {
            return new Regex(pattern, options, matchTimeout);
        }
    }
    catch
    {
        // Fallback on error
    }

    // Legacy fallback (without explicit match timeout)
    return new Regex(pattern, options);
}

1
Приятно получить это из профессионального источника (конечно, ничего против других); оценили.
Николас Петерсен

1
Это должно быть лучшим регулярным выражением, потому что, кажется, оно проверяет RFC 5321 и 5322. В нем пропущено некоторое модульное тестирование.
ToXinE

Не фиксирует точку в конце адреса электронной почты.
Селлорио

12

Это не соответствует всем требованиям RFC 5321 и 5322, но работает со следующими определениями.

@"^([0-9a-zA-Z]([\+\-_\.][0-9a-zA-Z]+)*)+"@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$";

Ниже приведен код

const String pattern =
   @"^([0-9a-zA-Z]" + //Start with a digit or alphabetical
   @"([\+\-_\.][0-9a-zA-Z]+)*" + // No continuous or ending +-_. chars in email
   @")+" +
   @"@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$";

var validEmails = new[] {
        "ma@hostname.com",
        "ma@hostname.comcom",
        "MA@hostname.coMCom",
        "m.a@hostname.co",
        "m_a1a@hostname.com",
        "ma-a@hostname.com",
        "ma-a@hostname.com.edu",
        "ma-a.aa@hostname.com.edu",
        "ma.h.saraf.onemore@hostname.com.edu",
        "ma12@hostname.com",
        "12@hostname.com",
};
var invalidEmails = new[] {
        "Abc.example.com",     // No `@`
        "A@b@c@example.com",   // multiple `@`
        "ma...ma@jjf.co",      // continuous multiple dots in name
        "ma@jjf.c",            // only 1 char in extension
        "ma@jjf..com",         // continuous multiple dots in domain
        "ma@@jjf.com",         // continuous multiple `@`
        "@majjf.com",          // nothing before `@`
        "ma.@jjf.com",         // nothing after `.`
        "ma_@jjf.com",         // nothing after `_`
        "ma_@jjf",             // no domain extension 
        "ma_@jjf.",            // nothing after `_` and .
        "ma@jjf.",             // nothing after `.`
    };

foreach (var str in validEmails)
{
    Console.WriteLine("{0} - {1} ", str, Regex.IsMatch(str, pattern));
}
foreach (var str in invalidEmails)
{
    Console.WriteLine("{0} - {1} ", str, Regex.IsMatch(str, pattern));
}

1
это выражение не соответствует действительным адресам !#$%&'*+-/=?^_. {|} ~ @ example.com` или этоDörte@Sörensen.example.com
TS

7

Лучшее регулярное выражение проверки электронной почты

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

И это использование: -

bool isEmail = Regex.IsMatch(emailString, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);

6

Попробуйте это для размера:

public static bool IsValidEmailAddress(this string s)
{
    var regex = new Regex(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
    return regex.IsMatch(s);
}

5

Попробуйте это, это работает для меня:

public bool IsValidEmailAddress(string s)
{
    if (string.IsNullOrEmpty(s))
        return false;
    else
    {
        var regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
        return regex.IsMatch(s) && !s.EndsWith(".");
    }
}

5

Почему бы не использовать проверку электронной почты на основе атрибутов EF6?

Как вы можете видеть выше, проверка Regex для электронной почты всегда имеет некоторую дыру. Если вы используете аннотации данных EF6, вы можете легко добиться надежной и надежной проверки электронной почты с доступным для этого атрибутом аннотации данных EmailAddress . Мне пришлось удалить проверку регулярного выражения, которую я использовал ранее для электронной почты, когда я получил ошибку регулярного выражения для мобильного устройства в поле ввода электронной почты. Когда атрибут аннотации данных использовался для проверки электронной почты, проблема на мобильном телефоне была решена.

public class LoginViewModel
{
    [EmailAddress(ErrorMessage = "The email format is not valid")]
    public string Email{ get; set; }

5

Это регулярное выражение работает отлично:

bool IsValidEmail(string email)
{
    return Regex.IsMatch(email, @"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))\z");
}

4

Этот предотвращает недействительные электронные письма, упомянутые другими в комментариях:

Abc.@example.com
Abc..123@example.com
name@hotmail
toms.email.@gmail.com
test@-online.com

Это также предотвращает электронные письма с двойными точками:

hello..world@example..com

Попробуйте протестировать с таким количеством недействительных адресов электронной почты, сколько сможете найти.

using System.Text.RegularExpressions;

public static bool IsValidEmail(string email)
{
    return Regex.IsMatch(email, @"\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,4}\z")
        && Regex.IsMatch(email, @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*");
}

См проверить адрес электронной почты с помощью регулярного выражения в C # .


Это возвращает false для всех моих недействительных адресов электронной почты. К сожалению, также возвращает false для многих действительных адресов электронной почты.
Марк


1
public static bool ValidateEmail(string str)
{                       
     return Regex.IsMatch(str, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
}

Я использую приведенный выше код для подтверждения адреса электронной почты.


1
   public bool VailidateEntriesForAccount()
    {
       if (!(txtMailId.Text.Trim() == string.Empty))
        {
            if (!IsEmail(txtMailId.Text))
            {
                Logger.Debug("Entered invalid Email ID's");
                MessageBox.Show("Please enter valid Email Id's" );
                txtMailId.Focus();
                return false;
            }
        }
     }
   private bool IsEmail(string strEmail)
    {
        Regex validateEmail = new Regex("^[\\W]*([\\w+\\-.%]+@[\\w\\-.]+\\.[A-Za-z] {2,4}[\\W]*,{1}[\\W]*)*([\\w+\\-.%]+@[\\w\\-.]+\\.[A-Za-z]{2,4})[\\W]*$");
        return validateEmail.IsMatch(strEmail);
    }

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочное значение
AStopher


1

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

Метод расширения, который вы можете вызвать с помощью:

myEmailString.IsValidEmailAddress();

Строка шаблона регулярного выражения, которую вы можете получить, вызвав:

var myPattern = Regex.EmailPattern;

Кодекс (в основном комментарии):

    /// <summary>
    /// Validates the string is an Email Address...
    /// </summary>
    /// <param name="emailAddress"></param>
    /// <returns>bool</returns>
    public static bool IsValidEmailAddress(this string emailAddress)
    {
        var valid = true;
        var isnotblank = false;

        var email = emailAddress.Trim();
        if (email.Length > 0)
        {
            // Email Address Cannot start with period.
            // Name portion must be at least one character
            // In the Name, valid characters are:  a-z 0-9 ! # _ % & ' " = ` { } ~ - + * ? ^ | / $
            // Cannot have period immediately before @ sign.
            // Cannot have two @ symbols
            // In the domain, valid characters are: a-z 0-9 - .
            // Domain cannot start with a period or dash
            // Domain name must be 2 characters.. not more than 256 characters
            // Domain cannot end with a period or dash.
            // Domain must contain a period
            isnotblank = true;
            valid = Regex.IsMatch(email, Regex.EmailPattern, RegexOptions.IgnoreCase) &&
                !email.StartsWith("-") &&
                !email.StartsWith(".") &&
                !email.EndsWith(".") && 
                !email.Contains("..") &&
                !email.Contains(".@") &&
                !email.Contains("@.");
        }

        return (valid && isnotblank);
    }

    /// <summary>
    /// Validates the string is an Email Address or a delimited string of email addresses...
    /// </summary>
    /// <param name="emailAddress"></param>
    /// <returns>bool</returns>
    public static bool IsValidEmailAddressDelimitedList(this string emailAddress, char delimiter = ';')
    {
        var valid = true;
        var isnotblank = false;

        string[] emails = emailAddress.Split(delimiter);

        foreach (string e in emails)
        {
            var email = e.Trim();
            if (email.Length > 0 && valid) // if valid == false, no reason to continue checking
            {
                isnotblank = true;
                if (!email.IsValidEmailAddress())
                {
                    valid = false;
                }
            }
        }
        return (valid && isnotblank);
    }

    public class Regex
    {
        /// <summary>
        /// Set of Unicode Characters currently supported in the application for email, etc.
        /// </summary>
        public static readonly string UnicodeCharacters = "À-ÿ\p{L}\p{M}ÀàÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü«»€₣äÄöÖüÜß"; // German and French

        /// <summary>
        /// Set of Symbol Characters currently supported in the application for email, etc.
        /// Needed if a client side validator is being used.
        /// Not needed if validation is done server side.
        /// The difference is due to subtle differences in Regex engines.
        /// </summary>
        public static readonly string SymbolCharacters = @"!#%&'""=`{}~\.\-\+\*\?\^\|\/\$";

        /// <summary>
        /// Regular Expression string pattern used to match an email address.
        /// The following characters will be supported anywhere in the email address:
        /// ÀàÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü«»€₣äÄöÖüÜß[a - z][A - Z][0 - 9] _
        /// The following symbols will be supported in the first part of the email address(before the @ symbol):
        /// !#%&'"=`{}~.-+*?^|\/$
        /// Emails cannot start or end with periods,dashes or @.
        /// Emails cannot have two @ symbols.
        /// Emails must have an @ symbol followed later by a period.
        /// Emails cannot have a period before or after the @ symbol.
        /// </summary>
        public static readonly string EmailPattern = String.Format(
            @"^([\w{0}{2}])+@{1}[\w{0}]+([-.][\w{0}]+)*\.[\w{0}]+([-.][\w{0}]+)*$",                     //  @"^[{0}\w]+([-+.'][{0}\w]+)*@[{0}\w]+([-.][{0}\w]+)*\.[{0}\w]+([-.][{0}\w]+)*$",
            UnicodeCharacters,
            "{1}",
            SymbolCharacters
        );
    }

1

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

    public static bool IsValidEmail(string email)
    {
        var r = new Regex(@"^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$");
        return !String.IsNullOrEmpty(email) && r.IsMatch(email);
    }

Это вернет True / False. (Действительный / неверный идентификатор электронной почты)


1

Это мой любимый подход к этому вопросу:

public static class CommonExtensions
{
    public static bool IsValidEmail(this string thisEmail)
        => !string.IsNullOrWhiteSpace(thisEmail) &&
           new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$").IsMatch(thisEmail);
}

Затем используйте созданное расширение строки как:

if (!emailAsString.IsValidEmail()) throw new Exception("Invalid Email");

1

Просто дайте мне знать, если это не работает :)

public static bool isValidEmail(this string email)
{

    string[] mail = email.Split(new string[] { "@" }, StringSplitOptions.None);

    if (mail.Length != 2)
        return false;

    //check part before ...@

    if (mail[0].Length < 1)
        return false;

    System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9_\-\.]+$");
    if (!regex.IsMatch(mail[0]))
        return false;

    //check part after @...

    string[] domain = mail[1].Split(new string[] { "." }, StringSplitOptions.None);

    if (domain.Length < 2)
        return false;

    regex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9_\-]+$");

    foreach (string d in domain)
    {
        if (!regex.IsMatch(d))
            return false;
    }

    //get TLD
    if (domain[domain.Length - 1].Length < 2)
        return false;

    return true;

}

1

Вот наш Regex для этого случая:

@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                       @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                       @".)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$",

Есть три части, которые проверяются. последний, вероятно, тот, который вам нужен. конкретный термин {2,6} обозначает минимальную / максимальную длину TLD в конце. НТН


0

Попробуйте следующий код:

using System.Text.RegularExpressions;
if  (!Regex.IsMatch(txtEmail.Text, @"^[a-z,A-Z]{1,10}((-|.)\w+)*@\w+.\w{3}$"))
        MessageBox.Show("Not valid email.");

0

STRING SEARCH с использованием метода регулярных выражений в C #

Как проверить письмо по регулярному выражению?

string EmailPattern = @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
if (Regex.IsMatch(Email, EmailPattern, RegexOptions.IgnoreCase))
{
    Console.WriteLine("Email: {0} is valid.", Email);
}
else
{
    Console.WriteLine("Email: {0} is not valid.", Email);
}

Использовать метод ссылки String.Regex ()


0

1

^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$

2

^(([^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$

0

Я думаю, что ваша каретка и знак доллара являются частью проблемы. Вы также должны немного изменить регулярное выражение, я использую следующее @ "[:] + ([\ w .-] +) @ ([\ w -.]) + ((. (\ ш) {2,3}) +)»


Когда вы используете результат Trim (':')
ABMoharram

0

Regex Email Pattern:

^(?:[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+\\.)*[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!\\.)){0,61}[a-zA-Z0-9]?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\\[(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\]))$

0

Я использую Regex.IsMatch ().

Прежде всего вам нужно добавить следующее утверждение:

using System.Text.RegularExpressions;

Тогда метод выглядит так:

private bool EmailValidation(string pEmail)
{
                 return Regex.IsMatch(pEmail,
                 @"^(?("")("".+?(?<!\\)""@)|(([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]))$",
                 RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}

Это частный метод из-за моей логики, но вы можете поместить метод как статический в другой слой, такой как «Утилиты», и вызывать его там, где вам нужно.


0

Там нет идеального регулярного выражения, но это довольно сильное, я думаю, на основе изучения RFC5322 . И с интерполяцией строк C #, я думаю, довольно легко следовать.

const string atext = @"a-zA-Z\d!#\$%&'\*\+-/=\?\^_`\{\|\}~";
var localPart = $"[{atext}]+(\\.[{atext}]+)*";
var domain = $"[{atext}]+(\\.[{atext}]+)*";
Assert.That(() => EmailRegex = new Regex($"^{localPart}@{domain}$", Compiled), 
Throws.Nothing);

Проверено с NUnit 2.x.


0

Я создал класс FormValidationUtils для проверки электронной почты:

public static class FormValidationUtils
{
    const string ValidEmailAddressPattern = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$";

    public static bool IsEmailValid(string email)
    {
        var regex = new Regex(ValidEmailAddressPattern, RegexOptions.IgnoreCase);
        return regex.IsMatch(email);
    }
}

0

Проверка электронной почты с использованием регулярных выражений

    string pattern = @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";

    //check first string
   if (Regex.IsMatch(EmailId1 , pattern))
   {    
       //if email is valid
        Console.WriteLine(EmailId1+ " is a valid Email address ");
   }

Источник: проверка электронной почты c #

Проверка без регулярного выражения с использованием конструктора класса MailAddress.MailAddress (String)

public bool IsEmailValid(string emailaddress)
{
 try
 {
    MailAddress m = new MailAddress(emailaddress);
    return true;
 }
 catch (FormatException)
 {
    return false;
 }
}

Это не будет соответствовать me@localhost. Пожалуйста, посмотрите на эти сайты: список TLD ; действительные / недействительные адреса ; регулярное выражение для адреса электронной почты RFC822
Toto
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.