Common Patterns: Email — Regex

Validasi Email dengan Regex Validasi email adalah salah satu use case regex yang paling umum. Mari kita bangun pattern-nya step by step. Struktur Email Sebuah…

Alamat email punya bentuk tetap: nama@domain. Regex email memeriksa bentuk itu, persis seperti kurir yang membaca label paket: ada nama penerima, ada jalan, ada kota? Kalau labelnya rusak, paketnya ditolak di loket. Tapi kurir di loket gak bisa tahu rumahnya beneran ada. Itu baru ketahuan waktu paketnya diantar. Di email, "mengantar" itu kirim email konfirmasi. Di pelajaran ini kita rakit pola email dari bahan pelajaran sebelumnya, mulai dari alamat di chat: [email protected].

🧪 Tebakan cepat: pola /^[^\s@]+@[^\s@]+\.[^\s@]+$/ menerima [email protected]. Apakah dia juga menerima [email protected], dengan titik dobel yang membuat alamat itu gak bisa dipakai? Tebak dulu, jawabannya ada di bagian "Batas regex untuk email".

Tiga bagian alamat email

Bagian Di [email protected] Di [email protected]
Local part, sebelum @ dina.putri siti
Domain, sesudah @ example yahoo.co
TLD, sesudah titik terakhir com id

Pola email tinggal menyusun tiga bagian itu: sesuatu, @, sesuatu, titik, akhiran.

Pola sederhana: [^\s@]+

const sederhana = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

console.log(sederhana.test("[email protected]")); // true
console.log(sederhana.test("[email protected]"));        // true
console.log(sederhana.test("invalid@"));               // false
console.log(sederhana.test("no-at-sign.com"));         // false
console.log(sederhana.test("dina [email protected]")); // false

Pola yang lebih ketat

const ketat = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;

console.log(ketat.test("[email protected]")); // true
console.log(ketat.test("[email protected]"));    // true
console.log(ketat.test("[email protected]"));       // true
console.log(ketat.test("[email protected]"));                  // false
Bagian Pola Artinya
Local part [A-Za-z0-9._%+-]+ huruf, angka, dan . _ % + -, satu atau lebih
@ @ tanda @ apa adanya
Domain [A-Za-z0-9.-]+ huruf, angka, titik, strip
Titik \. titik asli sebelum TLD
TLD [A-Za-z]{2,} minimal 2 huruf

Mengambil email dari teks

Buat mencari di dalam teks, buang ^ dan $, lalu tambah flag g.

const polaEmail = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g;

console.log(chat.match(polaEmail));                    // ['[email protected]']
console.log(chat.match(/[^\s@]+@[^\s@]+\.[^\s@]+/g));  // ['[email protected].']
console.log("tanpa alamat".match(polaEmail));          // null
console.log("tanpa alamat".match(polaEmail) || []);    // []

Batas regex untuk email

Regex cuma memeriksa bentuk. Titik dobel lolos di kedua pola: sederhana.test("[email protected]") dan ketat.test("[email protected]") sama-sama true. Itu jawaban tebakannya.

Pola yang terlalu ketat malah menolak alamat yang sah:

const kaku = /^[a-z0-9.]+@[a-z]+\.[a-z]{2,3}$/;
console.log(kaku.test("[email protected]"));    // false, padahal sah
console.log(kaku.test("[email protected]"));       // false, padahal sah
console.log(kaku.test("[email protected]")); // false, padahal sah

Browser juga punya pemeriksa bawaan: <input type="email">. Spesifikasi HTML menuliskan aturannya sebagai regex ini:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[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])?)*$/

Aturan itu sengaja disederhanakan. Dia menerima [email protected] dan dina@localhost (tanpa titik di domain). Aturan lengkap email (RFC 5322) jauh lebih rumit, dan regex yang mengaku "lengkap" panjangnya ribuan karakter. Jadi: regex atau type="email" untuk menangkap salah ketik di form, server memeriksa ulang, dan bukti satu-satunya alamat itu hidup adalah email konfirmasi yang diklik pemiliknya.

⚠️ Jebakan yang sering ketemu

TL;DR: Email = local part, @, domain, titik, TLD. Pola sederhana /^[^\s@]+@[^\s@]+\.[^\s@]+$/ cukup untuk banyak form: "[email protected]" lolos. Pola ketat /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/: [A-Za-z0-9._%+-]+ adalah local part sebelum @, dan [A-Za-z]{2,} minta TLD minimal 2 huruf, jadi [email protected] ditolak. Validasi pakai ^...$; mengambil dari teks tanpa ^...$ tapi dengan g, plus || [] karena match() bisa null. Regex cuma memeriksa bentuk: titik dobel tetap lolos, dan pola yang terlalu ketat menolak alamat sah. <input type="email"> memakai aturan HTML yang sengaja sederhana; bukti akhirnya email konfirmasi.

Yang akan kamu pelajari