Перевірка електронної пошти Regex


215

Я цим користуюся

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

regexp для перевірки електронної пошти

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

([\w\-]+) - це для домену другого рівня

((\.(\w){2,3})+)- і це для інших доменів рівня (від 3 до нескінченності), що включає крапку і 2 або 3 літерали

що не так з цим регулярним виразом?

EDIT: він не відповідає електронному листу "something@someth.ing"


1
Окрім того, що ви не включаєте дійсних символів, як зазначено у RFC 5321 та 5322 - нічого.
Бред Крісті


Я думаю, ви повинні сказати нам, що не так, і тоді інші можуть допомогти вам виправити неправильну річ.
Uwe Keim

10
У вас проблема -> ви думаєте, що «regex» -> тепер у вас є 2 проблеми ;-)
Якуб Конецький

1
Просто коментар до вашого регексу. З цим новим. Амстердамі, .info та іншими доменами регулярний вираз повинен бути:@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,})+)$""
Тон Сной

Відповіді:


372

Такий музей, як TLD, не узгоджується, і є кілька інших довгих 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
Працює чи не використовується спробу лову для перевірки введення, не рекомендується. Regex, безумовно, кращий шлях.
мерт

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
Повертає тест@-online.com як дійсний. Має бути недійсним.
Mathias F

7
Я вважаю, що це не вдасться у нових TLD, які випускаються, тому що у TLD ви можете мати більше 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
Я оновив свій проект регулярних виразів, щоб мати модульні
Rhyous

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

12
Парт. Чи можете ви сказати мені, яке правило RFC порушено вашою електронною поштою? Бо вгадайте, що. За даними RFC, це дійсно !!!! Якщо ви придбали URL-адресу in.in, ви можете створити цю електронну адресу. Розумієте?
Rhyous

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

36

Я знайшов приємний документ на MSDN для нього.

Як: Перевірте, чи є рядки у дійсному форматі електронної пошти http://msdn.microsoft.com/en-us/library/01escwtf.aspx (перевірте, що цей код також підтримує використання символів, що не належать до ASCII, для доменних імен Інтернету. )

Є 2 реалізація, для .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
Toto

Недійсний: Abc.example.com ТАК, це працює правильно, проте це "toms.email. @ Gmail.com"; не працює
Том Стікель

1
Довелося додати знак плюс: `@" ^ ([\ w - \. +] +) @ (([[[0-9] {1,3} \. [0-9] {1,3} \. [0-9] {1,3} \.) | (([\ W -] + \.) +)) ([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

Не захоплює крапку в кінці адреси електронної пошти.
Sellorio

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

Цей регекс працює чудово:

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 # .


Це повертає помилкове значення для всіх моїх недійсних електронних адрес. На жаль, також повертається помилковим для багатьох дійсних електронних адрес.
Марк

4

Чому б не використовувати перевірку електронної пошти на основі атрибутів EF6?

Як ви бачите вище, перевірка Regex для електронної пошти завжди має певний отвір. Якщо ви використовуєте анотації даних EF6, ви можете легко досягти надійної та більш вашої перевірки електронної пошти за допомогою атрибута анотації даних EmailAddress, доступного для цього. Мені довелося видалити перевірку регулярних виразів, яку я раніше використовував для електронної пошти, коли в полі введення електронної пошти було відмовлено від конкретного мобільного пристрою. Коли атрибут анотації даних, який використовується для перевірки електронної пошти, проблема на мобільному пристрої була вирішена.

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


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
string patternEmail = @"(?<email>\w+@\w+\.[a-z]{0,3})";
Regex regexEmail = new Regex(patternEmail);

1

Було здійснено багато спроб створити валідатор електронної пошти, який задовольняє майже всі вимоги до електронної пошти у всьому світі.

Спосіб розширення, за допомогою якого можна зателефонувати:

myEmailString.IsValidEmailAddress();

Рядок шаблону Regex ви можете отримати, зателефонувавши:

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 в кінці. HTH


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

ПОШУК ПОШУКУ ЗА ВИКОРИСТАННЯМ МЕТОДУ REGEX В 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);
}

Використовуйте метод Reference 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 -.]) + ((. (\ w) {2,3}) +) "


Коли ви використовуєте результат Trim (':')
ABMoharram

0

Шаблон електронної пошти Regex:

^(?:[\\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

Перевірка електронної пошти за допомогою regex

    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 #

Перевірка без Regex за допомогою конструктора класу 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.