Ekspresi reguler (regex) adalah salah satu alat paling kuat dalam gudang senjata seorang pengembang. Mereka memungkinkan Anda mendeskripsikan dan mencocokkan pola dalam teks dengan presisi yang luar biasa. Dari memvalidasi input pengguna hingga mengekstrak data dari log, dari operasi pencari-dan-ganti hingga perutean URL, regex digunakan di mana-mana dalam pengembangan perangkat lunak. Namun, regex memiliki reputasi sulit dipelajari dan lebih sulit lagi dibaca. Lembar contekan ini bertujuan untuk mengubahnya dengan memberikan penjelasan yang jelas, contoh praktis, dan referensi terstruktur yang dapat Anda kunjungi berulang kali.
Baik Anda seorang pemula yang menulis pola pertama atau pengembang berpengalaman yang mencari referensi cepat, panduan ini mencakup semua yang perlu Anda ketahui tentang ekspresi reguler. Anda dapat mempraktikkan semua pola di bawah ini menggunakan Penguji Regex DevBox gratis, yang menyediakan pencocokan real-time dan rincian pola terperinci.
Apa Itu Ekspresi Reguler?
Ekspresi reguler adalah urutan karakter yang mendefinisikan pola pencarian. Anggap saja sebagai bahasa khusus untuk mendeskripsikan pola teks. Ketika Anda menerapkan regex ke sebuah string, mesin regex memindai string dan menemukan semua substring yang cocok dengan pola yang Anda deskripsikan.
Sebagai contoh, regex \d{3}-\d{3}-\d{4} mencocokkan nomor telepon dalam format 555-123-4567. \d mencocokkan digit apa pun, {3} menentukan tepat tiga kemunculan, dan tanda hubung literal mencocokkan dirinya sendiri. Sederhana, bukan? Mari kita bangun di atas fondasi ini.
Sintaks Dasar
Karakter Literal
Sebagian besar karakter dalam regex mencocokkan dirinya sendiri secara literal. Regex hello mencocokkan string "hello" dan tidak ada yang lain. Huruf, digit, dan banyak karakter khusus bersifat literal secara default.
Metakarakter
Beberapa karakter memiliki arti khusus dalam regex. Metakarakter ini adalah blok bangunan pola:
.โ Mencocokkan karakter apa pun kecuali baris baru^โ Mencocokkan awal string (atau baris dalam mode multiline)$โ Mencocokkan akhir string (atau baris dalam mode multiline)*โ Mencocokkan nol atau lebih dari elemen sebelumnya+โ Mencocokkan satu atau lebih dari elemen sebelumnya?โ Mencocokkan nol atau satu dari elemen sebelumnya{n}โ Mencocokkan tepat n kemunculan{n,}โ Mencocokkan n atau lebih kemunculan{n,m}โ Mencocokkan antara n dan m kemunculan[abc]โ Set karakter: mencocokkan salah satu dari karakter a, b, atau c[^abc]โ Set yang dinegasikan: mencocokkan karakter apa pun kecuali a, b, atau c[a-z]โ Rentang: mencocokkan huruf kecil apa pun dari a sampai z\dโ Mencocokkan digit apa pun (setara dengan [0-9])\Dโ Mencocokkan non-digit apa pun\wโ Mencocokkan karakter kata apa pun (huruf, digit, garis bawah)\Wโ Mencocokkan karakter non-kata apa pun\sโ Mencocokkan karakter spasi apa pun (spasi, tab, baris baru)\Sโ Mencocokkan karakter non-spasi apa pun\bโ Batas kata\โ Meng-escape karakter khusus
Kuantifier
Kuantifier menentukan berapa kali elemen pola harus cocok. Tiga kuantifier dasar adalah * (nol atau lebih), + (satu atau lebih), dan ? (nol atau satu). Kurung kurawal memberi Anda kontrol presisi: {3} mencocokkan tepat 3 kali, {2,5} mencocokkan 2 sampai 5 kali, dan {3,} mencocokkan 3 kali atau lebih.
Jangkar
Jangkar tidak mencocokkan karakter โ mereka mencocokkan posisi. ^ menegaskan bahwa pencocokan harus terjadi di awal string, dan $ menegaskan bahwa pencocokan harus terjadi di akhir. Misalnya, ^hello mencocokkan "hello" hanya di awal string, dan world$ mencocokkan "world" hanya di akhir.
Grup dan Penangkapan
Tanda kurung membuat grup. Grup penangkap (pattern) tidak hanya mengelompokkan elemen bersama tetapi juga menangkap teks yang cocok untuk referensi nanti. Grup non-penangkap (?:pattern) mengelompokkan tanpa menangkap. Grup bernama (?<name>pattern) memungkinkan Anda mereferensikan tangkapan berdasarkan nama, bukan indeks.
// Contoh grup penangkap
(\d{3})-(\d{3})-(\d{4})
// Mencocokkan "555-123-4567"
// Grup 1: "555", Grup 2: "123", Grup 3: "4567"
// Contoh grup non-penangkap
(?:https?://)?(?:www\.)?example\.com
// Mencocokkan "example.com", "www.example.com", "https://example.com"
Pola Regex Umum
Validasi Email
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Pola ini mencocokkan sebagian besar format email umum. Ini memerlukan satu atau lebih karakter valid sebelum simbol @, nama domain dengan setidaknya satu titik, dan top-level domain setidaknya dua karakter. Perhatikan bahwa validasi email yang sepenuhnya sesuai RFC 5322 sangat kompleks โ pola ini mencakup 99% kasus dunia nyata.
Nomor Telepon (Format AS)
^\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$
Pola ini mencocokkan nomor telepon AS dalam berbagai format: (555) 123-4567, 555-123-4567, 555.123.4567, dan 5551234567. Tanda kurung opsional, pemisah, dan spasi membuatnya cukup fleksibel untuk sebagian besar kasus penggunaan.
Pencocokan URL
https?://(?:www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(?:/[\w.-]*)?
Pola ini mencocokkan URL HTTP dan HTTPS dengan awalan www opsional, nama domain, dan jalur opsional. Ini menangani struktur URL umum tetapi tidak mencakup setiap kasus edge yang didefinisikan dalam RFC 3986.
Alamat IPv4
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
Pola ini memvalidasi alamat IPv4 dengan memastikan setiap oktet antara 0 dan 255. Ini menolak alamat tidak valid seperti 256.1.1.1 atau 1.1.1.999.
Format Tanggal (YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
Pola ini mencocokkan tanggal dalam format ISO 8601. Ini memvalidasi bahwa bulan antara 01 dan 12, dan hari antara 01 dan 31. Perhatikan bahwa ini tidak memperhitungkan jumlah hari yang bervariasi di bulan berbeda โ logika tambahan diperlukan untuk validasi tanggal lengkap.
Kata Sandi Kuat
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
Pola ini memberlakukan kebijakan kata sandi kuat: setidaknya 8 karakter, dengan setidaknya satu huruf kecil, satu huruf besar, satu digit, dan satu karakter khusus. Lookahead (?=...) memeriksa keberadaan setiap tipe karakter tanpa mengonsumsi karakter.
Penjelasan Flag Regex
Flag memodifikasi perilaku mesin regex. Mereka ditambahkan setelah pembatas penutup (misalnya, /pattern/g).
- g (global): Menemukan semua pencocokan dalam string, bukan hanya yang pertama. Tanpa flag ini, mesin regex berhenti setelah pencocokan pertama.
- i (case-insensitive): Membuat pencocokan tidak peka huruf besar/kecil. Pola
/hello/imencocokkan "hello", "Hello", "HELLO", dan variasi huruf lainnya. - m (multiline): Membuat
^dan$mencocokkan awal dan akhir setiap baris, bukan hanya seluruh string. - s (dotall): Membuat titik
.mencocokkan karakter baris baru juga. Secara default, titik mencocokkan segalanya kecuali baris baru. - u (unicode): Mengaktifkan dukungan Unicode penuh. Ini penting saat bekerja dengan teks internasional yang menyertakan karakter di luar rentang ASCII.
- y (sticky): Mencocokkan hanya dari indeks yang ditunjukkan oleh properti lastIndex. Berguna untuk parsing inkremental.
Pencocokan Greedy vs Lazy
Secara default, kuantifier bersifat greedy โ mereka mencocokkan sebanyak mungkin. Misalnya, regex /<.*>/ diterapkan ke string <p>Hello</p> mencocokkan seluruh string <p>Hello</p>, bukan hanya <p>. Ini karena .* secara greedy mengonsumsi segalanya hingga > terakhir.
Untuk membuat kuantifier lazy (mencocokkan sesedikit mungkin), tambahkan tanda tanya ? setelahnya. Regex /<.*?>/ diterapkan ke string yang sama mencocokkan <p> pertama, lalu </p> pada pencocokan berikutnya. Pencocokan lazy sering kali yang Anda inginkan saat mengekstrak data antara pembatas.
// Greedy: mencocokkan "<p>Hello</p>"
<.*>
// Lazy: mencocokkan "<p>" lalu "</p>"
<.*?>
Memahami perbedaan antara pencocokan greedy dan lazy adalah salah satu konsep terpenting dalam regex. Kesalahan di sini adalah sumber bug yang umum, terutama saat memproses HTML, XML, atau format teks terstruktur lainnya.
Lookahead dan Lookbehind
Lookahead dan lookbehind adalah asersi lebar-nol โ mereka memeriksa pola tanpa mengonsumsi karakter. Mereka sangat berguna untuk pencocokan kondisional.
Positive Lookahead: (?=pattern)
Menegaskan bahwa pola harus mengikuti posisi saat ini, tetapi tidak menyertakannya dalam pencocokan. Misalnya, \d+(?=px) mencocokkan angka hanya jika segera diikuti oleh "px". Dalam string "12px 34em", ini mencocokkan "12" tetapi bukan "34".
Negative Lookahead: (?!pattern)
Menegaskan bahwa pola TIDAK BOLEH mengikuti posisi saat ini. Misalnya, \b(?!test)\w+\b mencocokkan semua kata utuh kecuali "test". Ini berguna untuk mengecualikan pola tertentu dari pencocokan.
Positive Lookbehind: (?<=pattern)
Menegaskan bahwa pola harus mendahului posisi saat ini. Misalnya, (?<=\$)\d+ mencocokkan angka hanya jika segera didahului oleh tanda dolar. Dalam "$100 dan $200", ini mencocokkan "100" dan "200".
Negative Lookbehind: (?<!pattern)
Menegaskan bahwa pola TIDAK BOLEH mendahului posisi saat ini. Misalnya, (?<!@)\b\w+@\w+\.\w+\b mencocokkan alamat email yang tidak didahului oleh simbol @, membantu menghindari pencocokan dalam string mirip email yang lebih panjang.
Contoh Praktis
Mengekstrak Angka dari Teks
const text = "Order 1234 has 56 items totaling $789.00";
const numbers = text.match(/\d+\.?\d*/g);
// Hasil: ["1234", "56", "789.00"]
Mengganti Data Sensitif
const text = "SSN: 123-45-6789 and CC: 4111-1111-1111-1111";
const redacted = text.replace(/\d{3}-\d{2}-\d{4}/g, "***-**-****");
// Hasil: "SSN: ***-**-**** and CC: 4111-1111-1111-1111"
Memisahkan String Sambil Menyimpan Pembatas
const csv = "red,green,blue,yellow";
const result = csv.split(/(?<=,)/);
// Hasil: ["red,", "green,", "blue,", "yellow"]
Memvalidasi Kode Warna Hex
^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
Pola ini mencocokkan kode warna hex 3-digit dan 6-digit, dengan atau tanpa awalan #. Ini mencocokkan #fff, #FFFFFF, fff, dan FFFFFF.
Tips untuk Menulis Regex yang Lebih Baik
- Mulai sederhana dan kembangkan: Mulailah dengan pola paling dasar yang berhasil, lalu tambahkan kompleksitas secara bertahap. Uji di setiap langkah.
- Gunakan raw string dalam kode: Di JavaScript, gunakan template literals atau konstruktor RegExp untuk menghindari double-escaping. Di Python, gunakan raw strings (r'pattern').
- Komentari pola kompleks: Banyak mesin regex mendukung flag
x, yang memungkinkan spasi dan komentar dalam pola. - Uji secara menyeluruh: Gunakan Penguji Regex DevBox untuk menguji pola Anda terhadap beberapa string input, termasuk kasus edge.
- Ketahui kapan tidak menggunakan regex: Untuk parsing HTML atau XML, gunakan parser yang tepat. Regex kuat, tetapi bukan alat yang tepat untuk setiap pekerjaan.
Ekspresi reguler adalah keterampilan yang memberi penghargaan atas latihan. Semakin banyak Anda menggunakannya, semakin intuitif mereka menjadi. Bookmark lembar contekan ini dan Penguji Regex DevBox, dan Anda akan memiliki semua yang dibutuhkan untuk menguasai pencocokan pola.