Aracılığıyla paylaş


Dizelerin geçerli e-posta biçiminde olduğunu doğrulama

Bu makaledeki örnek, bir dizenin geçerli e-posta biçiminde olduğunu doğrulamak için normal bir ifade kullanır.

Bu normal ifade, e-posta olarak kullanılabilecek ifadeler için oldukça basittir. Bir e-postayı doğrulamak için normal ifade kullanmak, e-postanın yapısının doğru olduğundan emin olmak için yararlıdır. Ancak, e-postanın gerçekten var olduğunu doğrulamak için bir değiştirme değildir.

✔️ DO, bir e-postanın geçerli yapısını denetlemek için küçük bir normal ifade kullanın.

✔️ DO, uygulamanızın bir kullanıcısı tarafından sağlanan adrese bir test e-postası gönderin.

❌ Bir e-postayı doğrulamanın tek yolu olarak normal ifade kullanmayın.

Bir e-postanın yapısının doğru olduğunu doğrulamak için mükemmel bir normal ifade oluşturmaya çalışırsanız, ifade o kadar karmaşık hale gelir ki hata ayıklaması veya geliştirilmesi inanılmaz derecede zordur. Normal ifadeler, doğru yapılandırılmış olsa bile bir e-postanın mevcut olduğunu doğrulayamaz. E-postayı doğrulamanın en iyi yolu, adrese test e-postası göndermektir.

Uyarı

Güvenilmeyen girişi işlemek için kullanırken System.Text.RegularExpressions bir zaman aşımı geçirin. Kötü amaçlı bir kullanıcı için giriş RegularExpressionssağlayabilir ve bu da Hizmet Reddi saldırısına neden olabilir. ASP.NET Zaman aşımı kullanan RegularExpressions Core framework API'leri.

Örnek

Örnek, dize geçerli bir e-posta adresi içeriyorsa ve false içermiyorsa ancak başka bir eylem gerçekleştirmezse döndüren true bir IsValidEmail yöntem tanımlar.

E-posta adresinin geçerli olduğunu doğrulamak için yöntemi, IsValidEmail etki alanı adını e-posta adresinden (@)(.+)$ ayırmak için normal ifade deseniyle yöntemini çağırırRegex.Replace(String, String, MatchEvaluator). Üçüncü parametre, eşleşen metni işleyen ve değiştiren yöntemi temsil eden bir MatchEvaluator temsilcidir. Normal ifade düzeni aşağıdaki gibi yorumlanır:

Desen Açıklama
(@) @ karakteriyle eşleş. Bu bölüm ilk yakalama grubudur.
(.+) Herhangi bir karakterin bir veya daha fazla tekrarını eşleştirin. Bu bölüm ikinci yakalama grubudur.
$ Dizenin sonunda eşleşmeyi sonlandırın.

Etki alanı adı@ karakteriyle birlikte yöntemine DomainMapper geçirilir. yöntemi, US-ASCII karakter aralığının dışındaki Unicode karakterlerini Punycode'a çevirmek için sınıfını kullanır IdnMapping . yöntemi, etki alanı adında geçersiz karakterler algılarsa IdnMapping.GetAscii bayrağını True da olarak ayarlarinvalid. yöntemi, @ simgesinden önce gelen Punycode etki alanı adını yöntemine IsValidEmail döndürür.

İpucu

Etki alanını normalleştirmek için basit (@)(.+)$ normal ifade desenini kullanmanız ve ardından başarılı veya başarısız olduğunu belirten bir değer döndürmeniz önerilir. Ancak, bu makaledeki örnekte, e-postayı doğrulamak için normal ifadenin nasıl daha fazla kullanılacağı açıklanmaktadır. E-postayı nasıl doğruladığınızdan bağımsız olarak, e-postanın mevcut olduğundan emin olmak için her zaman adrese bir test e-postası göndermeniz gerekir.

Ardından IsValidEmail yöntemi, adresin Regex.IsMatch(String, String) normal ifade desenine uygun olduğunu doğrulamak için yöntemini çağırır.

IsValidEmail yöntemi yalnızca e-posta biçiminin bir e-posta adresi için geçerli olup olmadığını belirler; e-postanın var olduğunu doğrulamaz. Ayrıca yöntemi, IsValidEmail üst düzey etki alanı adının IANA Kök Bölge Veritabanı'nda listelenen geçerli bir etki alanı adı olduğunu doğrulamaz ve bu da bir arama işlemi gerektirir.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

namespace RegexExamples
{
    class RegexUtilities
    {
        public static bool IsValidEmail(string email)
        {
            if (string.IsNullOrWhiteSpace(email))
                return false;

            try
            {
                // Normalize the domain
                email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
                                      RegexOptions.None, TimeSpan.FromMilliseconds(200));

                // Examines the domain part of the email and normalizes it.
                string DomainMapper(Match match)
                {
                    // Use IdnMapping class to convert Unicode domain names.
                    var idn = new IdnMapping();

                    // Pull out and process domain name (throws ArgumentException on invalid)
                    string domainName = idn.GetAscii(match.Groups[2].Value);

                    return match.Groups[1].Value + domainName;
                }
            }
            catch (RegexMatchTimeoutException e)
            {
                return false;
            }
            catch (ArgumentException e)
            {
                return false;
            }

            try
            {
                return Regex.IsMatch(email,
                    @"^[^@\s]+@[^@\s]+\.[^@\s]+$",
                    RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
            }
            catch (RegexMatchTimeoutException)
            {
                return false;
            }
        }
    }
}
Imports System.Globalization
Imports System.Text.RegularExpressions

Public Class RegexUtilities
    Public Shared Function IsValidEmail(email As String) As Boolean

        If String.IsNullOrWhiteSpace(email) Then Return False

        ' Use IdnMapping class to convert Unicode domain names.
        Try
            'Examines the domain part of the email and normalizes it.
            Dim DomainMapper =
                Function(match As Match) As String

                    'Use IdnMapping class to convert Unicode domain names.
                    Dim idn = New IdnMapping

                    'Pull out and process domain name (throws ArgumentException on invalid)
                    Dim domainName As String = idn.GetAscii(match.Groups(2).Value)

                    Return match.Groups(1).Value & domainName

                End Function

            'Normalize the domain
            email = Regex.Replace(email, "(@)(.+)$", DomainMapper,
                                  RegexOptions.None, TimeSpan.FromMilliseconds(200))

        Catch e As RegexMatchTimeoutException
            Return False

        Catch e As ArgumentException
            Return False

        End Try

        Try
            Return Regex.IsMatch(email,
                                 "^[^@\s]+@[^@\s]+\.[^@\s]+$",
                                 RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250))

        Catch e As RegexMatchTimeoutException
            Return False

        End Try

    End Function
End Class

Bu örnekte, normal ifade deseni ^[^@\s]+@[^@\s]+\.[^@\s]+$ aşağıdaki tabloda gösterildiği gibi yorumlanır. Normal ifade bayrağı kullanılarak RegexOptions.IgnoreCase derlenir.

Desen Açıklama
^ Eşleşmeye dizenin başlangıcından başlayın.
[^@\s]+ @ karakteri veya boşluk dışında herhangi bir karakterin bir veya daha fazla oluşumunu eşleştirin.
@ @ karakteriyle eşleş.
[^@\s]+ @ karakteri veya boşluk dışında herhangi bir karakterin bir veya daha fazla oluşumunu eşleştirin.
\. Tek bir nokta karakteriyle eşleş.
[^@\s]+ @ karakteri veya boşluk dışında herhangi bir karakterin bir veya daha fazla oluşumunu eşleştirin.
$ Dizenin sonunda eşleşmeyi sonlandırın.

Önemli

Bu normal ifade, geçerli bir e-posta adresinin her yönünü kapsayacak şekilde tasarlanmamıştır. Gerektiğinde genişletmeniz için bir örnek olarak sağlanır.

Ayrıca bkz.