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ş RegularExpressions
sağ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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin