Ekspresi reguler adalah salah satu alat yang paling kuat dan paling dibenci dalam pemrograman — kuat karena mereka memadatkan logika pencocokan string yang kompleks menjadi beberapa karakter, dibenci karena karakter tersebut terkenal tidak dapat dibaca dan rawan kesalahan. Menguasai regex membuahkan hasil di setiap bahasa dan hampir setiap peran teknis: cari dan ganti di editor, validasi formulir, penguraian log, ekstraksi data, aturan perutean, dan manipulasi teks baris perintah dengan alat seperti grep dan sed. Bagian di bawah ini mencakup sintaksis inti yang harus diketahui setiap pengembang, pola umum yang muncul dalam pekerjaan nyata, dan disiplin pengujian yang memisahkan regex kerja dari jenis regex yang menakutkan.
Sintaks Inti Yang Harus Diketahui Setiap Pengembang
Sintaks regex terlihat menakutkan tetapi elemen intinya terbatas dan layak untuk dihafal. Kelas karakter adalah dasarnya: `\d` cocok dengan digit apa pun, `\w` cocok dengan karakter kata apa pun (huruf, angka, garis bawah), `\s` cocok dengan spasi apa pun, dan versi huruf besarnya (`\D`, `\W`, `\S`) cocok dengan kebalikannya. Tanda kurung siku menentukan kelas karakter khusus: `[abc]` cocok dengan salah satu dari tiga karakter tersebut, `[a-z]` cocok dengan huruf kecil apa pun, `[^0-9]` cocok dengan apa pun kecuali angka. Penghitung menentukan berapa kali suatu pola harus cocok: `*` bernilai nol atau lebih, `+` bernilai satu atau lebih, `?` bernilai nol atau satu (opsional), `{3}` bernilai tepat 3, `{3,5}` bernilai 3 berbanding 5, `{3,}` bernilai 3 atau lebih. Penghitung bersifat serakah secara default, mencocokkan sebanyak mungkin; menambahkan `?` membuat mereka malas (`*?`, `+?`). Jangkar cocok dengan posisi, bukan karakter: `^` adalah awal string (atau baris dengan tanda `m`), `$` adalah akhir string, `\b` adalah batas kata. Pengelompokan menggunakan tanda kurung `(...)` pada kedua operator grup dan menangkap teks yang cocok untuk referensi nanti. Blok penyusun inti ini mencakup 90% kebutuhan regex praktis, dan sebagian besar misteri regex hilang setelah Anda menginternalisasi kosakata ini. Yang lainnya adalah variasi dari tema ini.
Pola Umum yang Muncul dalam Pekerjaan Nyata
Beberapa pola sering muncul di seluruh proyek sehingga layak untuk diingat sebagai templat. Alamat email (validasi longgar): `/^[\w.+-]+@[\w-]+\.[\w.-]+$/` — cukup baik untuk pemfilteran formulir, meskipun ekspresi reguler email yang benar secara formal mungkin terlalu panjang untuk tulisan manusia. Pencocokan URL: `/https?:\/\/[^\s]+/g` — bagus untuk mengekstrak URL dari teks, meskipun cocok dengan tanda baca di akhir yang ingin Anda potong. Nomor telepon AS: `/\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}/` — menangani tanda kurung, tanda hubung, dan spasi sebagai pemisah opsional. Alamat IP (IPv4): `/\b(?:\d{1,3}\.){3}\d{1,3}\b/` — sederhana namun tidak menolak 999.999.999.999 (yang memerlukan logika batasan nilai yang buruk). Tanggal ISO: `/\d{4}-\d{2}-\d{2}/` dengan grup bernama opsional `(?
Disiplin Pengujian: Cara Menulis Regex yang Benar-benar Berfungsi
Perbedaan antara regex yang bekerja dengan andal dan regex yang merusak produksi adalah disiplin pengujian. Empat praktik secara konsisten membedakan keduanya. Pertama, selalu uji pada kasus positif (input yang harus cocok) DAN kasus negatif (input yang tidak cocok). Sangat mudah untuk membuat pola yang cocok dengan semua yang Anda inginkan, hanya untuk mengetahui bahwa pola tersebut juga cocok dengan masukan yang tidak Anda inginkan. Satu set pengujian dengan 10 positif dan 10 negatif menangkap sebagian besar masalah. Kedua, uji terhadap kasus tepi secara khusus: string kosong, karakter tunggal, string sangat panjang, karakter Unicode, string hanya dengan spasi, string dengan baris baru, string dengan karakter regex khusus. Pola regex memiliki perilaku yang mengejutkan, dan input produksi pada akhirnya akan mencakup semuanya. Ketiga, waspadai kemunduran yang membawa bencana. Pola seperti `(a+)+b` yang cocok dengan `aaaaaaaaaaaaaaaaX` dapat memakan waktu eksponensial karena mesin mencoba setiap kemungkinan pengelompokan `a`s. Uji pola kompleks apa pun terhadap masukan yang tampak berbahaya (rangkaian panjang karakter berulang) dan amati waktu eksekusinya. Serangan ReDoS (Regular Expression Denial of Service) mengeksploitasi kerentanan ini dalam pola yang dibuat dengan buruk dan digunakan dalam validasi input. Keempat, gunakan penguji regex asli (yang ini, atau plugin editor) selama pengembangan daripada coba-coba dalam kode produksi — masukan visual dari menonton pertandingan yang disorot secara langsung saat Anda mengetik menghasilkan pola kerja 5–10× lebih cepat daripada men-debug pengujian yang gagal setelahnya.