Dasar-Dasar Ekspresi Reguler
Ekspresi reguler (regex) adalah pola yang menggambarkan teks. Panduan ini membahas komponen dasar yang paling sering Anda gunakan dan jebakan yang menyebabkan pencocokan lambat atau tak terduga.
Literal dan Kelas Karakter
Sebagian besar karakter cocok dengan dirinya sendiri: pola cat menemukan teks "cat". Beberapa karakter memiliki arti khusus, seperti . * + ? ( ) [ ] { } ^ $ | \. Untuk mencocokkan salah satunya secara harfiah, escape karakter tersebut dengan backslash, misalnya \. untuk titik.
Kelas karakter mencocokkan satu karakter dari sebuah kumpulan. [abc] cocok dengan a, b, atau c; [a-z] cocok dengan satu huruf kecil ASCII; [^0-9] cocok dengan apa pun yang bukan digit. Singkatan yang umum adalah \d (digit), \w (huruf, digit, atau garis bawah), \s (spasi putih), beserta kebalikannya \D, \W, dan \S. Titik . cocok dengan karakter apa pun kecuali pergantian baris.
Di JavaScript, \w dan \d hanya mencakup karakter ASCII. Untuk mencocokkan huruf dalam bahasa apa pun, gunakan properti Unicode seperti \p{L} dengan flag u.
Kuantifier dan Jangkar
Kuantifier menyatakan berapa kali item sebelumnya boleh berulang:
| Sintaks | Arti | Contoh |
|---|---|---|
* | 0 kali atau lebih | ab* cocok dengan a, ab, abbb |
+ | 1 kali atau lebih | \d+ cocok dengan 7 atau 2026 |
? | 0 atau 1 kali | colou?r cocok dengan color dan colour |
{n,m} | Antara n dan m kali | \d{2,4} cocok dengan 2 sampai 4 digit |
Jangkar mencocokkan posisi, bukan karakter. ^ adalah awal dan $ adalah akhir input (atau setiap baris dengan flag m). \b adalah batas kata, sehingga \bcat\b menemukan "cat" tetapi tidak di dalam "concatenate". Saat memvalidasi seluruh nilai, pasang jangkar di kedua ujung: ^\d{5}$ hanya menerima tepat lima digit.
Grup dan Tangkapan
Tanda kurung mengelompokkan bagian dari pola sehingga kuantifier atau alternasi berlaku padanya: (ab)+ mengulang "ab", dan (jpg|png) cocok dengan salah satu kata. Grup biasa juga menangkap teks yang cocok, yang dapat Anda pakai kembali dalam penggantian sebagai $1, $2, dan seterusnya.
Grup bernama seperti (?<year>\d{4}) membuat pola lebih mudah dibaca dan dapat dirujuk sebagai $<year>. Jika Anda hanya perlu pengelompokan, grup tanpa tangkapan (?:...) menghindari pembuatan tangkapan yang tidak terpakai. Penguji RegEx LeedyBox mencantumkan setiap kecocokan beserta grup tangkapannya dan mempratinjau penggantian.
Flag
Flag mengubah perilaku seluruh pola. Flag JavaScript yang umum adalah:
g(global): temukan semua kecocokan, bukan hanya yang pertama.i(ignore case): anggap huruf besar dan kecil sama.m(multiline):^dan$cocok di setiap pergantian baris.s(dotAll):.juga cocok dengan pergantian baris.u(unicode): mengaktifkan pencocokan yang memahami Unicode dan kelas\p{...}.
JavaScript juga memiliki y (sticky) dan d (indeks kecocokan), yang juga didukung oleh penguji.
Greedy vs Lazy, dan Catastrophic Backtracking
Secara bawaan kuantifier bersifat greedy (rakus): kuantifier mencocokkan sebanyak mungkin, lalu mengembalikan karakter jika sisa pola gagal. Pada teks <b>bold</b>, pola <.+> cocok dengan seluruh string. Menambahkan ? membuat kuantifier menjadi lazy (malas), sehingga <.+?> hanya cocok dengan <b>. Kelas negasi seperti <[^>]+> sering kali lebih jelas dan lebih cepat.
Sebagian besar mesin regex, termasuk milik JavaScript, menggunakan backtracking. Kuantifier bersarang seperti (a+)+$ atau alternatif yang saling tumpang-tindih dapat membuat mesin mencoba kombinasi dalam jumlah sangat besar saat pencocokan gagal, yang dapat membuat halaman atau server macet. Ini dikenal sebagai catastrophic backtracking, dan dengan input yang tidak tepercaya dapat dimanfaatkan untuk serangan denial-of-service (ReDoS). Hindari kuantifier bersarang atas karakter yang sama, utamakan kelas yang spesifik daripada .*, dan uji pola dengan input panjang yang tidak cocok.
Varian Regex Berbeda-beda
Tidak ada satu standar regex tunggal. JavaScript, Python, Java, .NET, PCRE (dipakai oleh PHP), Go, dan database masing-masing mendukung sintaks yang sedikit berbeda. Lookbehind, kuantifier posesif, sintaks grup bernama, kelas Unicode, dan sintaks penggantian bervariasi. Mesin RE2 milik Go, misalnya, tidak mendukung lookaround atau backreference.
Penguji RegEx LeedyBox menggunakan mesin JavaScript browser Anda. Pola yang berfungsi di sana mungkin perlu diubah di bahasa lain, jadi uji lagi di tempat pola itu akan dijalankan.
Pertanyaan Umum
Mengapa pola saya hanya cocok dengan kemunculan pertama?
Tanpa flag g, JavaScript berhenti setelah kecocokan pertama. Aktifkan g untuk menemukan semua kecocokan.
Bisakah regex memvalidasi alamat email?
Regex dapat memeriksa apakah sebuah nilai tampak masuk akal, tetapi tidak dapat memastikan bahwa alamat tersebut ada. Mengirim email konfirmasi adalah cara yang umum untuk memverifikasinya.
Mengapa ^ hanya cocok sekali dalam teks multibaris?
Secara bawaan ^ dan $ merujuk ke seluruh input. Aktifkan flag m agar keduanya cocok di awal dan akhir setiap baris.