Lembar Contekan Regex Gratis

Panduan referensi interaktif untuk ekspresi reguler.

Pengujian pola langsung

Uji pola

Tidak ada kecocokan

Cara penggunaan

  1. Telusuri kategori pola atau gunakan bilah pencarian untuk menemukan pola tertentu.
  2. Masukkan ekspresi reguler di bidang «Uji pola» dan teks contoh di «Teks uji».
  3. Aktifkan/nonaktifkan flag (global, tidak peka huruf besar/kecil, multibaris) dan lihat kecocokan disorot secara instan.

Pertanyaan yang sering diajukan

Apa itu ekspresi reguler?

Ekspresi reguler (regex atau regexp) adalah pola yang digunakan untuk mencari, menemukan, dan mengganti teks. Menggunakan karakter dan sintaks khusus untuk mendefinisikan string yang akan ditemukan.

Untuk apa flag?

Global (g) mencari semua kecocokan. Tidak peka huruf besar/kecil (i) mengabaikan huruf besar/kecil. Multibaris (m) mencocokkan ^ dan $ pada batas baris alih-alih batas string.

Bisakah saya menggunakan referensi ini di kode saya?

Ya! Setelah Anda menguji pola dan memverifikasinya bekerja, salin pola regex langsung ke kode JavaScript, Python, atau bahasa apa pun lainnya.

Sejarah singkat bahasa pola

Ekspresi reguler bermula sebagai bagian ilmu komputer teoritis. Stephen Kleene mendefinisikan "himpunan reguler" dalam makalah 1956 tentang jaringan saraf; Ken Thompson menanamnya di Unix pada 1968 lewat grep. Pustaka regex sumber terbuka Henry Spencer (pertengahan 1980-an) menjadi dasar banyak implementasi setelahnya. Larry Wall memperluas sintaks secara drastis di Perl, dan "Perl-compatible regular expressions" (PCRE) ciptaannya menjadi standar de facto yang diikuti sebagian besar bahasa modern. Hari ini terdapat beberapa varian regex yang sangat terkait namun berbeda halus, dan pola yang berfungsi di satu mesin tidak selalu berfungsi sama persis di mesin lain.

Mesin tempat pola Anda hidup

Sintaks yang sama dapat berarti hal berbeda di mesin yang berbeda. Keluarga besar:

Penguji interaktif lembar contekan ini berjalan di JavaScript, jadi pola dievaluasi oleh mesin JS peramban. Pola yang berfungsi di sini mungkin berperilaku berbeda di Python atau PHP. Sebagian besar perbedaan berada pada fitur lanjutan (lookbehind, escape properti Unicode, referensi balik), bukan sintaks dasar.

Blok bangunan inti

Hampir setiap pola regex dibangun dari unsur-unsur berikut:

Pola yang layak diingat

Beberapa pola sering muncul, sehingga layak untuk diingat:

KegunaanPola
Email (dasar)^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
URLhttps?://[^\s]+
Nomor telepon AS\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Tanggal ISO (TTTT-BB-HH)\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
Alamat IPv4 (tanpa validasi oktet)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
Warna heksadesimal^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
Spasi di awal atau akhir baris^\s+|\s+$
Beberapa spasi berturut-turut\s{2,}

Catatan tentang regex email: validasi email penuh RFC 5322 memerlukan regex raksasa 6.000 karakter. Bentuk sederhana di atas menerima 99% alamat email asli dan tidak menolak satu pun yang sah; untuk produksi, kirim email konfirmasi alih-alih mencoba memvalidasi sintaks dengan sempurna.

Tamak vs malas: kejutan yang sering muncul

Secara bawaan, kuantor bersifat tamak: mereka mencocokkan sebanyak mungkin selama pola keseluruhan masih bisa cocok. Jadi <.+> terhadap <a>text</a> mencocokkan seluruh string, bukan hanya <a>, karena .+ menarik sebanyak yang bisa. Untuk mencocokkan string sekecil mungkin, tambahkan ? pada kuantor: <.+?> mencocokkan <a> lalu </a> secara terpisah. Pilihan tamak/malas adalah salah satu sumber bug terbanyak yang berbentuk "kenapa regex saya tidak mencocokkan yang saya harapkan".

Backtracking katastrofik dan ReDoS

Beberapa pola regex dapat memakan waktu eksponensial untuk gagal pada input tertentu, sebuah kelas kerentanan denial-of-service bernama ReDoS (Regular Expression Denial of Service). Pelaku klasiknya adalah kuantor bersarang seperti (a+)+ atau (a|aa)+ yang diterapkan pada untaian panjang a diikuti karakter yang tidak cocok. Mesin mencoba setiap kemungkinan cara membagi string sebelum menyerah, dan jumlah caranya eksponensial.

Insiden dunia nyata: gangguan Cloudflare 2019 dipicu oleh regex yang dipasang di aturan WAF, yang katastrofik melakukan backtracking pada input tertentu. Stack Overflow mengalami insiden serupa pada Juli 2016: sebuah regex post-trim (^[\s‌]+|[\s‌]+$) menemui backtracking eksponensial pada satu komentar berisi kira-kira 20.000 karakter spasi berturut-turut dan mematikan situs selama 34 menit. Kebiasaan defensif: hindari kuantor bersarang, lebih suka kelompok atomik ((?>...)) bila didukung, dan pertimbangkan memakai RE2 atau mesin waktu linier untuk input tidak tepercaya.

Keanehan per bahasa yang layak diketahui

Kapan TIDAK menggunakan regex

Kalimat terkenal Jamie Zawinski tahun 1997: "Sebagian orang, saat dihadapkan pada masalah, berpikir 'aku tahu, aku akan pakai ekspresi reguler.' Sekarang mereka punya dua masalah."

Kesalahan umum

  1. Lupa meng-escape karakter khusus. ., *, ?, +, (, ), [, ], {, }, \, ^, $, |, / semuanya memiliki makna khusus. Untuk mencocokkannya secara literal, awali dengan backslash.
  2. Kuantor tamak menelan terlalu banyak. Tambahkan ? untuk pencocokan malas ketika menginginkan kecocokan terkecil.
  3. Lupa flag global dan bertanya-tanya kenapa hanya kecocokan pertama yang muncul. String.prototype.match() di JavaScript hanya mengembalikan kecocokan pertama tanpa flag g.
  4. Backtracking katastrofik pada input panjang. Kuantor bersarang seperti (a+)+ bisa macet pada input tertentu. Uji dengan kasus tepi.
  5. Mengasumsikan regex yang sama berperilaku sama di setiap bahasa. Lookbehind, escape Unicode, dan singkatan kelas karakter semua berbeda.
  6. Mencoba memvalidasi email terlalu ketat. Regex RFC 5322 yang benar secara teknis tidak dapat dipelihara; regex sederhana ditambah email konfirmasi saat pendaftaran adalah pola yang berhasil.
  7. Memakai regex pada HTML, JSON, atau CSV. Gunakan parser yang tepat; waktu yang dihemat di muka akan hilang oleh bug.

Pertanyaan lain yang sering diajukan

Kenapa pola saya berfungsi di sini tetapi gagal di kode saya?

Penyebab paling umum adalah perbedaan mesin. RegExp JavaScript tidak mendukung beberapa fitur yang dimiliki PCRE (dan sebaliknya). Jebakan umum: lookbehind ditambahkan terlambat ke JS (ES2018), sintaks kelompok bernama sedikit berbeda, escape properti Unicode memerlukan flag u, dan kelas karakter POSIX seperti [[:alpha:]] umumnya tidak ada di JS. Uji di mesin yang akan Anda gunakan untuk produksi.

Adakah cara "global" untuk mencocokkan lintas banyak baris?

Dua flag bekerja bersama. Flag m (multilinear) membuat ^ dan $ cocok di awal dan akhir setiap baris alih-alih seluruh string. Flag s (dotall) membuat . juga cocok dengan karakter newline. Dipadu dengan g untuk global, Anda bisa menulis pola lintas-baris yang menemukan setiap kecocokan: /^foo.+$/gms.

Apakah pola dan teks uji saya dikirim ke mana pun?

Tidak. Pencocokan pola memakai mesin JavaScript RegExp bawaan peramban; tidak ada yang diunggah ke server mana pun. Ini penting saat Anda menguji pola terhadap data log produksi nyata, respons API internal, atau konten sensitif.

Apakah saya perlu mempelajari lookbehind?

Berguna tetapi tidak esensial. Lookbehind memungkinkan Anda mencocokkan teks yang didahului oleh sesuatu tanpa memasukkan "sesuatu" itu ke dalam kecocokan. Contoh: (?<=\$)\d+ mencocokkan digit setelah tanda dolar tanpa menelan tanda dolar. Didukung di PCRE, JavaScript modern (ES2018+), dan modul regex Python. Jika menulis pola portabel, periksa mesin target terlebih dahulu.

Mengapa memakai (?:...) alih-alih (...)?

Kelompok tanpa penangkapan ((?:...)) sedikit lebih cepat, tidak menempati slot dalam larik tangkap, dan menjaga hasil pencocokan tetap rapi. Gunakan kapanpun Anda butuh mengelompokkan untuk alternasi atau kuantifikasi tetapi tidak butuh mengekstrak teks yang cocok. (http|https):// membuat tangkapan yang mungkin tak diperlukan; (?:http|https):// tidak.

Apa cara yang tepat untuk mencocokkan karakter Unicode?

Di JavaScript, tambahkan flag u dan gunakan escape properti Unicode: /\p{Letter}+/gu mencocokkan rangkaian huruf di aksara mana pun. Tanpa flag u, \w hanya mencocokkan karakter kata ASCII. Modul re Python peka Unicode secara bawaan di Python 3. Java butuh Pattern.UNICODE_CHARACTER_CLASS. Sebagian besar mesin punya cara untuk peka Unicode; lihat dokumentasi mesin Anda.

Alat terkait

Pemformat & Validator JSON Gratis Online URL Encoder / Decoder Gratis Pengonversi Kasus Teks