Cara memverifikasi bahwa string dalam format email yang valid

Contoh dalam artikel ini menggunakan ekspresi reguler untuk memverifikasi bahwa string dalam format email yang valid.

Ungkapan reguler ini relatif sederhana dengan apa yang sebenarnya dapat digunakan sebagai email. Menggunakan ekspresi reguler untuk memvalidasi email berguna untuk memastikan bahwa struktur email sudah benar. Namun, ini bukan penggantian untuk memverifikasi email sebenarnya ada.

✔️ Gunakan ekspresi reguler kecil untuk memeriksa struktur email yang valid.

✔️ Kirim email uji ke alamat yang disediakan oleh pengguna aplikasi Anda.

❌ JANGAN gunakan ekspresi reguler sebagai satu-satunya cara Anda memvalidasi email.

Jika Anda mencoba membuat ekspresi reguler yang sempurna untuk memvalidasi bahwa struktur email sudah benar, ekspresi menjadi sangat kompleks sehingga sangat sulit untuk di-debug atau ditingkatkan. Ekspresi reguler tidak dapat memvalidasi email, meskipun itu terstruktur dengan benar. Cara terbaik untuk memvalidasi email adalah dengan mengirim email uji ke alamat.

Peringatan

Saat menggunakan System.Text.RegularExpressions untuk memproses masukan yang tidak tepercaya, berikan batas waktu. Pengguna berbahaya dapat memberikan input ke RegularExpressions, yang menyebabkan serangan Penolakan Layanan. ASP.NET API kerangka kerja Core yang menggunakan RegularExpressions batas waktu.

Contoh

Contoh mendefinisikan IsValidEmail metode, yang mengembalikan true jika string berisi alamat email yang valid dan false jika tidak tetapi tidak mengambil tindakan lain.

Untuk memastikan bahwa alamat email valid, IsValidEmail metode memanggil Regex.Replace(String, String, MatchEvaluator) metode dengan (@)(.+)$ pola ekspresi reguler untuk memisahkan nama domain dari alamat email. Parameter ketiga adalah MatchEvaluator delegasi yang mewakili metode yang memproses dan menggantikan teks yang cocok. Pola ekspresi reguler ditafsirkan sebagai berikut:

Pola Deskripsi
(@) Cocok dengan karakter @. Bagian ini adalah grup pengambilan pertama.
(.+) Cocokkan satu atau beberapa kejadian dari karakter apa pun. Bagian ini adalah grup pengambilan kedua.
$ Akhiri pencocokan pada akhir string.

Nama domain, bersama dengan karakter @, diteruskan ke DomainMapper metode . Metode ini menggunakan IdnMapping kelas untuk menerjemahkan karakter Unicode yang berada di luar rentang karakter AS-ASCII ke Punycode. Metode ini juga mengatur invalid bendera ke True jika IdnMapping.GetAscii metode mendeteksi karakter yang tidak valid dalam nama domain. Metode mengembalikan nama domain Punycode yang didahului oleh simbol @ ke IsValidEmail metode.

Tip

Disarankan agar Anda menggunakan pola ekspresi reguler sederhana (@)(.+)$ untuk menormalkan domain lalu mengembalikan nilai yang menunjukkan bahwa domain tersebut lulus atau gagal. Namun, contoh dalam artikel ini menjelaskan cara menggunakan ekspresi reguler lebih lanjut untuk memvalidasi email. Terlepas dari bagaimana Anda memvalidasi email, Anda harus selalu mengirim email pengujian ke alamat untuk memastikan email tersebut ada.

Metode ini IsValidEmail kemudian memanggil Regex.IsMatch(String, String) metode untuk memverifikasi bahwa alamat sesuai dengan pola ekspresi reguler.

Metode ini IsValidEmail hanya menentukan apakah format email valid untuk alamat email; metode ini tidak memvalidasi bahwa email ada. Selain itu IsValidEmail , metode ini tidak memverifikasi bahwa nama domain tingkat atas adalah nama domain yang valid yang tercantum dalam Database Zona Akar IANA, yang akan memerlukan operasi pencarian.

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

Dalam contoh ini, pola regex ditafsirkan ^[^@\s]+@[^@\s]+\.[^@\s]+$ seperti yang ditunjukkan pada tabel berikut. Ekspresi reguler dikompilasi menggunakan RegexOptions.IgnoreCase bendera.

Pola Deskripsi
^ Mulailah pertandingan di awal string.
[^@\s]+ Cocokkan satu atau beberapa kejadian karakter apa pun selain karakter @ atau spasi putih.
@ Cocok dengan karakter @.
[^@\s]+ Cocokkan satu atau beberapa kejadian karakter apa pun selain karakter @ atau spasi putih.
\. Mencocokkan satu karakter titik.
[^@\s]+ Cocokkan satu atau beberapa kejadian karakter apa pun selain karakter @ atau spasi putih.
$ Akhiri pencocokan pada akhir string.

Penting

Ekspresi reguler ini tidak dimaksudkan untuk mencakup setiap aspek alamat email yang valid. Ini disediakan sebagai contoh bagi Anda untuk memperpanjang sesuai kebutuhan.

Lihat juga