Cara menggunakan penguji regex
- Masukkan pola Anda tanpa garis miring di sekelilingnya, misalnya
\d{3}-\d{4}. - Aktifkan flag yang Anda perlukan (
g,i,m,s,u,y). - Tempel teks uji. Kecocokan disorot secara langsung dan setiap grup tangkapan dicantumkan.
- Opsional, masukkan string pengganti, dengan
$1atau$<name>untuk grup, untuk melihat pratinjau hasilnya.
Penguji ini memakai mesin regex JavaScript bawaan browser Anda. Pola dan data uji Anda tetap berada di perangkat Anda dan tidak diunggah atau disimpan.
Sekilas sintaks regex JavaScript
Ragam regular expression berbeda antarbahasa pemrograman. Alat ini memakai ragam JavaScript (ECMAScript), sehingga hasilnya sesuai dengan yang dilakukan RegExp, String.prototype.match, dan replace di browser dan Node.js. Sebagian besar sintaks berlaku juga di Python, PCRE, dan Java, tetapi detail seperti sintaks grup bernama dan dukungan lookbehind berbeda-beda.
Flag
| Flag | Nama | Efek |
|---|---|---|
g | global | Menemukan semua kecocokan, bukan berhenti setelah yang pertama. |
i | ignoreCase | Pencocokan tidak peka huruf besar-kecil. |
m | multiline | ^ dan $ cocok di awal dan akhir setiap baris. |
s | dotAll | . juga cocok dengan jeda baris. |
u | unicode | Memperlakukan pola sebagai code point Unicode; mengaktifkan escape properti \p{...}. |
y | sticky | Hanya cocok pada posisi yang ditentukan oleh lastIndex. |
Blok pembangun
- Kelas karakter:
[abc], rentang[a-z], negasi[^0-9], singkatan\d(digit),\w(karakter kata),\s(spasi putih) dan negasinya\D,\W,\S. Tanpa flagu,\wdan\dhanya mencakup ASCII. - Kuantifier:
*(0 atau lebih),+(1 atau lebih),?(0 atau 1),{n},{n,},{n,m}. Tambahkan?untuk membuatnya lazy:.*?. - Grup:
(...)menangkap,(?:...)mengelompokkan tanpa menangkap,(?<year>\d{4})membuat grup bernama, dan\1atau\k<year>merujuk kembali padanya. - Anchor:
^,$dan batas kata\b. - Lookaround:
(?=...)lookahead positif,(?!...)lookahead negatif,(?<=...)lookbehind positif,(?<!...)lookbehind negatif. Semuanya menguji konteks tanpa menghabiskan karakter.
// Nominal harga yang didahului tanda dolar, tanpa tandanya
/(?<=\$)\d+(?:\.\d{2})?/g "Total: $42.50" → "42.50"
// Ubah format tanggal dengan grup bernama
"2024-03-15".replace(/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/, "$<d>.$<m>.$<y>")
// "15.03.2024"
Pola yang umum
| Tujuan | Pola | Keterbatasan |
|---|---|---|
| Email (sederhana) | ^[^\s@]+@[^\s@]+\.[^\s@]+$ | Hanya pemeriksaan kewajaran. Sintaks alamat lengkap jauh lebih rumit; pastikan dengan mengirim email. |
| Alamat IPv4 | ^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$ | Menolak oktet di atas 255 dan angka nol di depan. Tidak menangani IPv6. |
| Tanggal (YYYY-MM-DD) | ^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ | Menerima tanggal yang mustahil seperti 2023-02-31. Validasi dengan pustaka tanggal. |
| URL (http/https) | ^https?:\/\/[^\s/$.?#][^\s]*$ | Pemeriksaan longgar. Gunakan konstruktor URL untuk parsing yang sebenarnya. |
Khusus untuk alamat IP, konverter alamat IP mem-parse dan mengonversi IPv4 maupun IPv6.
Jebakan
Catastrophic backtracking
Kuantifier bersarang atau tumpang tindih bisa membuat mesin backtracking seperti milik JavaScript mencoba jalur dalam jumlah eksponensial ketika pencocokan gagal. Beberapa lusin karakter dapat membekukan tab browser atau, di server, memungkinkan serangan denial-of-service (ReDoS):
/^(a+)+$/.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!") // bisa hang
/^a+$/.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!") // seketika
Hindari pola seperti (a+)+, (a|a)*, atau (.*)*, buat alternatif saling eksklusif, dan bersikaplah spesifik: [^"]* lebih aman daripada .* di dalam tanda kutip.
Hal lain yang perlu diwaspadai
- Regex dengan flag
gmengingatlastIndex, jadi memanggiltest()berulang kali pada objek yang sama akan bergantian antaratruedanfalse. - Saat membangun pola dari string, garis miring terbalik harus digandakan:
new RegExp("\\d+"). - Lupa memakai
^dan$berarti validator menerima input apa pun yang sekadar mengandung kecocokan.
Pertanyaan yang sering diajukan
Mengapa regex saya berfungsi di sini tetapi tidak di Python atau PHP?
Ragamnya berbeda. Python menulis grup bernama sebagai (?P<name>...) dan hanya mendukung lookbehind berlebar tetap; PCRE milik PHP membungkus pola dalam delimiter. Aturan escape untuk string literal juga berbeda antarbahasa.
Apa perbedaan antara kuantifier greedy dan lazy?
Kuantifier greedy (.*) mencocokkan sebanyak mungkin lalu mundur; yang lazy (.*?) mencocokkan sesedikit mungkin. Pada <b>x</b>, <.*> mencocokkan seluruh string sedangkan <.*?> hanya mencocokkan <b>.
Apakah JavaScript mendukung lookbehind?
Ya, sejak ES2018, dan tidak seperti banyak mesin lain, JavaScript mengizinkan lookbehind dengan panjang variabel. Semua browser utama saat ini mendukungnya.
Bagaimana cara mencocokkan titik atau tanda kurung literal?
Escape karakter itu dengan garis miring terbalik: \., \[, \(. Di dalam kelas karakter, sebagian besar karakter bersifat literal, jadi [.] juga mencocokkan titik.
Diperbarui