Sampai di sini, pencarian kita terbatas pada teks yang ditulis persis: includes("teh") hanya menemukan kata “teh”, bukan “teh tarik” yang berbeda sedikit, apalagi pola seperti “ORD diikuti angka”. Pertanyaan berbentuk bentuk-teks semacam itu butuh alat lain: regular expression atau regex, yaitu cara mendeskripsikan pola teks, bukan teksnya.
Di JavaScript, regex bukan sekadar notasi — ia adalah object dengan method sendiri. Pattern yang ditulis di antara garis miring dibaca engine saat berkas dimuat, diubah menjadi struktur internal, lalu diuji terhadap string pada saat program berjalan. Karena itu regex sering disebut mini-bahasa di dalam JavaScript: aturan penulisannya sendiri, tetapi tetap satu object biasa bagi kode kita.
Chapter ini membangun fondasinya: menulis pattern pertama dengan regex literal, memeriksanya dengan test(), membaca detail kecocokan dengan exec(), dan memilih antara literal /.../ dengan constructor new RegExp. Elemen pattern yang lebih kaya menyusul di chapter Regex Patterns.
Pattern Pertama: Regex Literal #
Cara termudah membuat regex adalah menulis pattern di antara dua garis miring. Pattern paling sederhana adalah teks biasa: /kopi/ berarti mencari rangkaian huruf k-o-p-i persis, tanpa karakter khusus apa pun.
const kalimat = "Budi memesan kopi dan Siti memesan teh";
const pola = /kopi/;
console.log(typeof pola);
console.log(pola.test(kalimat));
console.log(pola.test("air putih"));Output yang Dihasilkan:
object
true
falseBaris pertama menghasilkan object: regex bukan string, melainkan object yang punya method dan properti sendiri. Method test() memeriksa apakah pattern menemukan kecocokan pada string yang diberikan — true bila ada, false bila tidak.
Regex object juga diterima sebagai argumen oleh beberapa method string, seperti match dan replace yang sudah kita lihat sekilas di chapter sebelumnya:
const kalimat = "Budi memesan kopi dan Siti memesan teh";
console.log(kalimat.match(/kopi/)[0]);
console.log(kalimat.replace(/teh/, "espresso"));Output yang Dihasilkan:
kopi
Budi memesan kopi dan Siti memesan espressomatch mengembalikan object kecocokan bila pattern ditemukan, dan [0] mengambil teksnya. replace dengan argumen regex berperilaku seperti replace dengan string biasa: hanya kecocokan pertama yang diganti — sampai flag khusus diperkenalkan di chapter Regex Flags.
Sebagai gambaran besar, method yang menerima regex tersebar di dua sisi. Dari sisi regex object ada test() dan exec(); dari sisi string ada match, matchAll, replace, replaceAll, search, dan split. Dua kelompok itu menghasilkan bentuk jawaban yang berbeda, dan bagian berikutnya membandingkan yang paling sering dipakai.
test(): Pemeriksaan Benar-Salah #
test() paling pas dipakai di dalam percabangan, karena kembaliannya sudah berupa boolean:
const laporan = "Laporan penjualan bulan Maret sudah selesai";
if (/selesai/.test(laporan)) {
console.log("Status: selesai");
} else {
console.log("Status: masih dikerjakan");
}Output yang Dihasilkan:
Status: selesaiMekanismenya: regex memindai string dari kiri, dan begitu ada bagian yang cocok dengan pattern, pencarian berhenti lalu test() mengembalikan true. Bila seluruh string selesai dipindai tanpa kecocokan, kembaliannya false. Perhatikan bahwa kata “selesai” ditemukan meskipun berada di tengah kalimat — pencarian regex tidak terikat pada posisi awal atau akhir.
exec(): Detail Sebuah Kecocokan #
test() hanya menjawab ya atau tidak. exec() memberi detail lebih: bila pattern cocok, ia mengembalikan object kecocokan yang menyimpan teks yang ditemukan ([0]), posisi kemunculannya (index), dan string asalnya (input). Bila tidak cocok, kembaliannya null.
const kalimat = "Budi memesan kopi dan Siti memesan teh";
const hasil = /kopi/.exec(kalimat);
console.log(hasil[0]);
console.log(hasil.index);
console.log(hasil.input === kalimat);Output yang Dihasilkan:
kopi
13
trueHuruf k dari kata “kopi” tepat berada di indeks 13, dan itulah angka yang dilaporkan hasil.index. Pembanding === di baris ketiga membuktikan hasil.input adalah string yang sama dengan kalimat.
Bila yang dibutuhkan hanya posisinya tanpa teks kecocokannya, method string search() adalah versi ringkasnya: ia menerima regex dan mengembalikan indeks kecocokan pertama, atau -1 bila tidak ada — konvensi yang sama dengan indexOf pada chapter Searching Strings:
const kalimat = "Budi memesan kopi";
console.log(kalimat.search(/kopi/));
console.log(kalimat.search(/teh/));Output yang Dihasilkan:
13
-1Dengan begitu, pasangan method regex dan string saling melengkapi: test() untuk ya/tidak, exec() untuk teks plus posisi, dan search() untuk posisi saja.
Regex Literal vs new RegExp #
Ada dua pintu menuju regex object. Regex literal — /kopi/ — ditulis saat kode disusun dan cocok untuk pattern yang sudah pasti. Constructor new RegExp(...) menerima string dan membangun pattern saat program berjalan; ia satu-satunya pilihan bila pattern berasal dari variabel, misalnya kata kunci yang diketik pengguna.
Perbedaan waktu pembuatan keduanya juga berdampak pada kesalahan penulisan. Pattern literal yang salah bentuk — misalnya /(/ dengan kurung yang tidak ditutup — membuat seluruh berkas gagal dimuat dengan pesan SyntaxError: Invalid regular expression: /(/: Unterminated group, sehingga kesalahannya ketahuan sejak awal. Pattern dari constructor baru dievaluasi ketika barisnya dijalankan, sehingga pattern yang salah hanya terlihat saat jalur kode itu benar-benar dieksekusi.
const kataDicari = "teh";
const pola = new RegExp(kataDicari);
console.log(pola.test("Budi memesan kopi dan Siti memesan teh"));
console.log(pola.test("air putih"));Output yang Dihasilkan:
true
falseGanti isi kataDicari, dan pattern yang diuji ikut berubah tanpa menyentuh baris pemanggilannya. Kemampuan ini menjadi penting saat kita menulis fitur pencarian yang polanya ditentukan pengguna.
Perbedaan itu bisa dibuktikan langsung. Pattern \d berarti satu digit angka — penjelasan lengkapnya menunggu di chapter Regex Patterns:
console.log(new RegExp("\\d").test("kirim 5 paket"));
console.log(new RegExp("\d").test("kirim 5 paket"));Output yang Dihasilkan:
true
falseBaris pertama memakai "\\d" sehingga regex yang terbentuk benar-benar mencari angka — angka 5 ditemukan. Baris kedua memakai "\d" yang oleh JavaScript disederhanakan menjadi string "d", sehingga yang dicari adalah huruf d — dan kalimat itu memang tidak memuat huruf d.
Studi Kasus: Uji Pattern pada Teks Pesanan #
Berkas berikut merangkum chapter ini: satu pattern dari literal, satu dari constructor, lalu exec() untuk membaca detail kecocokan pertama.
// uji-pola.js
// Membandingkan regex literal dan RegExp constructor pada teks pesanan.
const kalimat = "Budi memesan kopi dan Siti memesan teh";
// 1. Regex literal: pattern ditulis langsung di dalam kode
const polaKopi = /kopi/;
console.log(polaKopi.test(kalimat));
console.log(polaKopi.test("air putih"));
// 2. RegExp constructor: pattern dibangun dari variabel saat program berjalan
const kataDicari = "teh";
const polaDinamis = new RegExp(kataDicari);
console.log(polaDinamis.test(kalimat));
// 3. exec: mengembalikan detail kecocokan, atau null bila tidak cocok
const hasil = polaKopi.exec(kalimat);
console.log(hasil[0]);
console.log(hasil.index);
console.log(typeof polaKopi);
const gagal = polaKopi.exec("air putih");
console.log(gagal);Output yang Dihasilkan:
true
false
true
kopi
13
object
nullJalankan dengan node uji-pola.js dan cocokkan hasilnya. Mari kita telaah baris-baris pentingnya:
- Baris 7 (
const polaKopi = /kopi/): regex literal menyimpan pattern “kopi” ke dalam konstanta sehingga bisa dipakai berkali-kali. - Baris 8–9:
test()mengembalikantrueuntuk kalimat yang memuat “kopi” danfalseuntuk “air putih”. - Baris 13 (
new RegExp(kataDicari)): pattern “teh” dibangun dari isi variabel — ganti isinya, dan pattern yang diuji ikut berubah. - Baris 17–19:
exec()menemukan “kopi” pada indeks 13;hasil[0]berisi teks kecocokan danhasil.indexposisinya. - Baris 20 (
typeof polaKopi): pengingat bahwa regex adalahobject, bukan string. - Baris 22–23: tanpa kecocokan,
exec()mengembalikannull— bentuk kembalian yang wajib diantisipasi.
Pattern /kopi/ dan /teh/ di chapter ini masih berupa teks biasa. Kekuatan regex sesungguhnya baru terasa ketika pattern mampu mendeskripsikan bentuk teks — kumpulan karakter, jumlah pengulangan, dan posisi — dan itulah kosakata yang kita pelajari di chapter Regex Patterns.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
uji-pola.js
Unduh berkas// uji-pola.js
// Membandingkan regex literal dan RegExp constructor pada teks pesanan.
const kalimat = "Budi memesan kopi dan Siti memesan teh";
// 1. Regex literal: pattern ditulis langsung di dalam kode
const polaKopi = /kopi/;
console.log(polaKopi.test(kalimat));
console.log(polaKopi.test("air putih"));
// 2. RegExp constructor: pattern dibangun dari variabel saat program berjalan
const kataDicari = "teh";
const polaDinamis = new RegExp(kataDicari);
console.log(polaDinamis.test(kalimat));
// 3. exec: mengembalikan detail kecocokan, atau null bila tidak cocok
const hasil = polaKopi.exec(kalimat);
console.log(hasil[0]);
console.log(hasil.index);
console.log(typeof polaKopi);
const gagal = polaKopi.exec("air putih");
console.log(gagal);