Regex pattern adalah template yang bisa digunakan ulang untuk mencocokkan urutan karakter tertentu di dalam teks - bayangkan seperti fitur "cari" versi turbo yang bekerja di hampir semua bahasa pemrograman. Mau validasi alamat email, membersihkan nomor telepon dari form, atau mem-parsing file log, segelintir regular expression yang tepat sudah cukup menangani 90% kebutuhan kamu. Panduan ini mengumpulkan pola-pola paling praktis, menjelaskan cara kerja masing-masing, dan menunjukkan cara mengadaptasinya.
Daftar Isi
Kilasan Sintaks Regex
Sebelum masuk ke pola-polanya, berikut ringkasan elemen dasar yang akan sering kamu temui. Meski sudah pernah pakai regex sebelumnya, punya referensi cepat seperti ini di satu tempat selalu berguna.
| Token | Arti | Contoh kecocokan |
|---|---|---|
.
|
Karakter apa pun kecuali baris baru |
a.c
cocok dengan
abc
,
a1c
|
\d
|
Digit apa pun (0-9) |
\d\d
cocok dengan
42
|
\w
|
Karakter kata (huruf, digit, underscore) |
\w+
cocok dengan
hello_world
|
\s
|
Whitespace (spasi, tab, baris baru) |
\s+
cocok dengan beberapa spasi
|
^
/
$
|
Awal / akhir string |
^\d+$
hanya cocok dengan
123
|
{n,m}
|
Antara n dan m pengulangan |
\d{2,4}
cocok dengan
12
hingga
1234
|
[abc]
|
Kelas karakter - salah satu dari a, b, c |
[aeiou]
cocok dengan semua huruf vokal
|
(?:...)
|
Grup non-capturing | Mengelompokkan tanpa menyimpan backreference |
(?=...)
|
Positive lookahead | Memeriksa apa yang mengikuti tanpa mengonsumsinya |
Panduan regular expressions MDN Web Docs adalah referensi terlengkap untuk sintaks regex JavaScript, dan sebagian besar pola di bawah ini bisa langsung digunakan di Python, PHP, Java, dan Ruby dengan sedikit perbedaan flag.
Validasi Email
Email adalah kasus penggunaan regex yang paling klasik - sekaligus yang paling sering salah ditangani developer karena terlalu ketat. Secara teknis,
spesifikasi RFC 5322
mengizinkan alamat seperti
"very unusual"@example.com
yang hampir tidak ada regex yang bisa menanganinya. Untuk 99% validasi input di dunia nyata, gunakan pola yang pragmatis:
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$
Penjelasan tiap bagian:
-
[a-zA-Z0-9._%+\-]+- bagian lokal (sebelum @); mengizinkan titik, tanda plus, tanda hubung, underscore -
@- tanda @ secara literal -
[a-zA-Z0-9.\-]+- nama domain, termasuk subdomain -
\.[a-zA-Z]{2,}- TLD minimal 2 karakter (.io, .com, .museum)
URL dan Alamat Web
Pattern matching URL mencakup berbagai kebutuhan, mulai dari mengekstrak tautan dari teks biasa hingga memvalidasi kolom website yang diisi pengguna.
https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)
-
https?- cocok denganhttpmaupunhttps -
(?:www\.)?- awalan www yang opsional -
[-a-zA-Z0-9@:%._+~#=]{1,256}- karakter hostname, hingga 256 karakter -
\.[a-zA-Z0-9()]{1,6}- TLD -
\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)- path, query string, dan fragment yang opsional
Jika hanya perlu memvalidasi (bukan mengekstrak), bungkus dengan anchor
^
dan
$
.
Nomor Telepon
Nomor telepon terkenal berantakan karena formatnya sangat bervariasi tergantung negara dan kebiasaan pengguna. Dua pola berikut sudah mencakup sebagian besar skenario:
Format AS/Kanada (NANP)
^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$
Cocok dengan:
555-867-5309
,
(555) 867 5309
,
+1.555.867.5309
,
5558675309
Internasional (format E.164)
^\+[1-9]\d{6,14}$
E.164 adalah format yang digunakan oleh sebagian besar API telepon (Twilio, AWS SNS). Dimulai dengan
+
dan kode negara, tanpa spasi atau tanda baca.
Tanggal dan Waktu
Pattern matching tanggal umum digunakan di parser log, validator form, dan pipeline data. Format yang kamu targetkan bergantung pada sumber input.
ISO 8601 (YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
Format AS (MM/DD/YYYY)
^(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/\d{4}$
Waktu 24 jam (HH:MM atau HH:MM:SS)
^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?$
Perlu diingat bahwa pola-pola ini hanya memvalidasi format, bukan logika kalender. Pola ini tetap akan menerima
2024-02-31
(31 Februari tidak ada). Untuk validasi tanggal yang ketat, lakukan parsing menggunakan library tanggal di bahasa pemrograman kamu setelah pengecekan regex.
Validasi Kekuatan Password
Aturan password biasanya mengharuskan kombinasi jenis karakter tertentu dan panjang minimum. Lookahead membuat ini lebih bersih tanpa perlu beberapa pengecekan terpisah.
Minimal 8 karakter, setidaknya satu huruf besar, satu huruf kecil, satu digit
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
Kuat: 8+ karakter, huruf besar, huruf kecil, digit, dan karakter khusus
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,}$
Setiap
(?=.*[...])
adalah lookahead yang memindai seluruh string untuk mencari setidaknya satu karakter yang cocok. Bagian terakhir
.{8,}
menerapkan panjang minimum. Kamu bisa mengganti
{8,}
dengan
{12,}
untuk menerapkan minimum 12 karakter, sesuai dengan
panduan NIST SP 800-63B
.
Alamat IP
IPv4
^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$
Pola ini secara tepat menolak nilai seperti
999.0.0.1
dengan mencocokkan setiap oktet secara eksplisit dalam rentang 0-255.
IPv6 (disederhanakan)
^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
Pola ini menangani format 8 grup penuh. Untuk notasi terkompresi (misalnya
::1
untuk loopback), polanya jauh lebih kompleks - pada titik itu, parsing menggunakan library jaringan lebih andal daripada regex.
HTML dan Markup
Beberapa pola bertarget memang benar-benar berguna di sini. Saran umum "jangan parsing HTML dengan regex" tetap berlaku untuk dokumen lengkap - gunakan DOM parser yang tepat seperti BeautifulSoup atau DOMParser untuk itu. Namun untuk tugas-tugas spesifik dan terbatas, regex bekerja dengan baik.
Hapus semua tag HTML
<[^>]*>
Ekstrak konten dari tag tertentu (misalnya <title>)
([^<]*)<\/title>
Capture group 1 berisi teks title.
Cocokkan kode warna hex HTML
#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})\b
Cocok dengan singkatan 3 digit (
#fff
) maupun bentuk lengkap 6 digit (
#ffffff
).
Pola Utilitas Sehari-hari
Pola-pola ini sering muncul di berbagai jenis proyek.
Slug (string ramah URL)
^[a-z0-9]+(?:-[a-z0-9]+)*$
Cocok dengan string seperti
my-blog-post-2024
. Tidak ada huruf besar, tidak ada tanda hubung di awal/akhir, tidak ada tanda hubung ganda.
Nomor kartu kredit (format dasar, tanpa spasi)
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
-
Diawali dengan
4- Visa (13 atau 16 digit) -
Diawali dengan
51-55- Mastercard (16 digit) -
Diawali dengan
34atau37- Amex (15 digit) -
Diawali dengan
6011atau65- Discover (16 digit)
Normalisasi whitespace (gabungkan beberapa spasi)
\s{2,}
Ganti hasil kecocokan dengan satu spasi untuk membersihkan input pengguna yang berantakan atau teks hasil scraping.
Hanya digit
^\d+$
Hanya alfanumerik
^[a-zA-Z0-9]+$
Cocokkan baris yang mengandung sebuah kata (case-insensitive dengan flag)
^.*\bword\b.*$
Word boundary
\b
mencegah kecocokan
word
di dalam
password
.
Ekstrak nomor versi (semver)
\bv?(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.]+))?(?:\+([a-zA-Z0-9.]+))?\b
Menangkap major, minor, patch, label pre-release, dan build metadata dari string seperti
v2.14.0-beta.1+build.42
.
Flag dan Tips Praktis
Regex pattern berperilaku berbeda tergantung flag yang kamu gunakan. Berikut flag yang paling sering dibutuhkan:
| Flag | JS | Python | Efek |
|---|---|---|---|
| Case-insensitive |
i
|
re.IGNORECASE
|
Memperlakukan huruf besar dan kecil sebagai sama |
| Global (temukan semua) |
g
|
re.findall()
|
Mengembalikan semua kecocokan, bukan hanya yang pertama |
| Multiline |
m
|
re.MULTILINE
|
^
dan
$
mencocokkan batas baris, bukan batas string
|
| Dotall |
s
|
re.DOTALL
|
.
juga cocok dengan karakter baris baru
|
Beberapa kebiasaan yang akan menghemat waktu debugging kamu:
- Selalu uji dengan kasus tepi - string kosong, panjang maksimum, karakter Unicode, dan string yang hampir-tapi-tidak-sepenuhnya valid.
-
Gunakan non-capturing group
(?:...)saat kamu tidak membutuhkan konten yang dicocokkan - lebih cepat dan lebih bersih daripada capturing group. -
Tambahkan anchor pada pola validasi
dengan
^dan$agar substring yang tampak valid di dalam string yang tidak valid tidak lolos begitu saja. -
Waspadai catastrophic backtracking
- quantifier bersarang seperti
(a+)+bisa membuat regex engine hang pada input yang dirancang khusus. Jaga quantifier tetap sederhana dan spesifik. - Gunakan regex tester saat membangun pola. regex101.com menampilkan rincian kecocokan secara langsung, menjelaskan setiap token, dan memungkinkan kamu beralih antara PCRE, JavaScript, Python, dan flavor lainnya.
Uji dan validasi regex pattern tanpa perlu menebak-nebak
Membangun regex pattern yang andal untuk validasi input jadi lebih cepat saat kamu punya alat yang tepat. Jelajahi utilitas developer gratis kami untuk membersihkan, memeriksa, dan mentransformasi teks menggunakan regex pattern dan banyak lagi.
Coba Alat Gratis Kami →
Quantifier greedy (seperti
.*
) mencocokkan sebanyak mungkin lalu melakukan backtracking. Quantifier lazy (seperti
.*?
) mencocokkan sesedikit mungkin. Misalnya, pada string
bold
, pola
<.*>
cocok dengan seluruh string, sedangkan
<.*?>
hanya cocok dengan
. Gunakan quantifier lazy saat mengekstrak konten di antara pembatas.
Sebagian besar ya, tapi ada perbedaannya. Modul
re
Python menggunakan sintaks bergaya PCRE dan mendukung named group dengan
(?P
. JavaScript menggunakan sintaks flag yang sedikit berbeda dan tidak mendukung lookbehind di engine yang lebih lama (sebelum ES2018). Untuk pekerjaan lintas bahasa, gunakan subset yang umum: kelas karakter, quantifier, anchor, dan grup dasar.
Regex aman digunakan untuk validasi format di production - hampir semua web framework menggunakannya. Risikonya ada pada pola yang ditulis dengan buruk sehingga rentan terhadap serangan ReDoS (regex denial-of-service) melalui catastrophic backtracking. Hindari quantifier bersarang, buat pola yang spesifik, dan selalu tetapkan batas panjang input yang wajar sebelum regex dijalankan.
Di sebagian besar engine yang umum, keduanya setara untuk input ASCII. Perbedaannya muncul dengan Unicode:
\d
di beberapa engine (seperti Python 3 dengan mode Unicode) juga cocok dengan digit dari skrip lain, seperti angka Arab-Indik. Jika kamu secara ketat hanya ingin digit ASCII 0-9, gunakan
[0-9]
agar lebih eksplisit. Untuk sebagian besar validasi form web, perbedaan ini tidak terlalu berpengaruh.
Kamu butuh dua hal: flag
dotall
(agar
.
cocok dengan baris baru) dan kemungkinan flag
multiline
(agar
^
dan
$
menjadi anchor ke setiap baris, bukan ke seluruh string). Di JavaScript, gunakan
/pattern/ms
. Di Python, kombinasikan
re.DOTALL | re.MULTILINE
. Tanpa dotall,
.
berhenti di baris baru dan pola kamu tidak akan mencakup beberapa baris.