Regex: Alat yang Berguna Sekaligus Berbahaya
Hampir setiap developer punya momen yang sama: menulis satu baris regex untuk menyelesaikan masalah yang terasa sepele, lalu beberapa minggu kemudian menemukan bug aneh yang ternyata berasal dari baris itu juga. Regex itu istimewa karena rasio kekuatan terhadap jumlah karakter yang ditulis sangat tinggi — tapi rasio itu juga yang membuatnya berbahaya. Semakin ringkas sebuah pola, semakin mudah pola itu menyembunyikan asumsi yang salah.
Saya sering memakai regex di pekerjaan sehari-hari, terutama saat menangani integrasi data dari sistem lama di lingkungan klinik/rumah sakit, atau saat membersihkan input sebelum masuk ke pipeline yang melibatkan LLM. Tapi seiring waktu saya jadi lebih hati-hati kapan regex layak dipakai, dan kapan sebaiknya diganti pendekatan lain.
Kapan regex memang alat yang tepat
Regex paling kuat ketika masalahnya benar-benar soal pola karakter, bukan soal struktur atau makna. Contoh yang masih sangat sehat dipakai regex:
- Validasi format sederhana seperti nomor telepon, kode pos, atau format tanggal tertentu.
- Ekstraksi token dari log teks yang formatnya konsisten.
- Pencarian-dan-ganti satu kali di editor, bukan bagian dari logika aplikasi permanen.
Di Laravel misalnya, memakai aturan validasi regex: untuk memastikan sebuah field hanya berisi huruf, angka, dan strip itu wajar dan aman, karena ruang lingkupnya sempit dan sudah jelas didefinisikan sejak awal.
Kapan regex mulai menciptakan bug tersembunyi
Masalah muncul ketika regex dipakai untuk hal yang sebenarnya butuh parser atau pemahaman struktur, bukan sekadar pencocokan pola. Kasus klasik yang sering saya lihat: memotong teks berdasarkan panjang karakter atau kata kunci tertentu memakai regex, lalu tanpa sadar memotong di tengah kata atau di tengah entitas yang seharusnya utuh.
Sebagai ilustrasi, bayangkan sebuah regex yang dipakai untuk memotong ringkasan teks setelah kata tertentu, misalnya untuk memisahkan bagian "diagnosis" dari catatan medis. Kalau pola pencariannya hanya mengandalkan kata kunci tanpa mempertimbangkan variasi penulisan (huruf besar/kecil, singkatan, tanda baca di sekitarnya), hasilnya bisa memotong kalimat di posisi yang salah — istilah medis yang seharusnya utuh malah terpenggal jadi setengah kata, dan itu baru ketahuan saat outputnya dipakai lebih lanjut, misalnya sebagai konteks untuk model bahasa.
Pola umum yang membuat regex berbahaya:
- Greedy matching yang menelan lebih banyak teks dari yang dimaksud, terutama saat menggunakan
.*tanpa batasan. - Asumsi format input selalu konsisten, padahal data dunia nyata penuh variasi (spasi ganda, encoding berbeda, karakter tak terlihat).
- Regex yang ditulis untuk mencocokkan struktur bertingkat seperti HTML, JSON, atau markup lain — ini area yang sebenarnya sudah punya parser khusus dan sebaiknya tidak dipaksakan lewat regex.
- Pola yang terlalu kompleks sehingga tidak ada orang lain di tim (termasuk diri sendiri enam bulan kemudian) yang bisa membacanya sekali lihat.
Cara saya menjaga regex tetap aman dipakai
Beberapa kebiasaan yang cukup membantu:
- Selalu uji regex dengan kasus tepi (edge case): string kosong, karakter unicode, input yang jauh lebih panjang atau pendek dari ekspektasi.
- Kalau polanya mulai butuh lebih dari satu grup tangkap bersarang, itu sinyal untuk berhenti dan pertimbangkan parser atau pustaka khusus.
- Beri komentar di atas regex yang menjelaskan maksudnya dalam bahasa manusia, karena regex tidak self-documenting.
- Untuk pemotongan teks yang berhubungan dengan makna (bukan sekadar format), saya lebih memilih memotong berdasarkan batas kata atau kalimat yang eksplisit, bukan berdasarkan posisi karakter mentah hasil regex.
Takeaway
Regex itu alat untuk mencocokkan pola karakter, bukan alat untuk memahami makna atau struktur. Selama dipakai sesuai batasan itu — validasi format, ekstraksi sederhana, pencarian teks — regex tetap salah satu alat paling efisien yang kita punya. Begitu dipakai untuk menggantikan logika yang seharusnya sadar konteks, seperti memotong kalimat atau mem-parsing struktur bertingkat, di situlah bug tersembunyi mulai lahir. Aturan sederhana yang saya pegang: kalau saya tidak bisa menjelaskan sebuah regex dalam satu kalimat kepada rekan tim, itu tanda saya perlu pendekatan lain.