03 / PANDUAN
Alur kerja aman untuk menguji ekspresi reguler
Loop tulis-uji-refaktor untuk ekspresi reguler JavaScript: data sampel realistis, higiene catastrophic backtracking, disiplin anchor, semantik flag, dan mengapa menguji di peramban menjaga pola tetap privat.
Loop: tulis, uji, refaktor
Regex yang andal tidak pernah ditulis dalam satu kali jalan. Mulai dari pola terkecil yang cocok dengan satu contoh nyata, jalankan, lalu perluas atau perketat terhadap contoh berikutnya. Teks sampel adalah spesifikasinya; polanya adalah implementasinya.
Loop berjalan cepat ketika umpan baliknya instan: penguji yang mengevaluasi ulang pada setiap ketukan tombol mengubah setiap edit menjadi eksperimen dengan jawaban langsung, dan itulah mengapa workspace khusus mengalahkan menjalankan ulang skrip dengan tangan.
- Mulai dari sampelTulis pola terhadap sampel konkret, bukan dari ingatan: tempel satu baris nyata dari log atau dokumen yang ingin Anda urai.
- Uji setiap editUji setelah setiap perubahan—regex tidak punya peringatan compiler, jadi satu-satunya umpan balik adalah apa yang cocok dan apa yang terlewat.
- Refaktor untuk pembacaRefaktor untuk keterbacaan setelah lolos: grup tangkapan bernama dan grup non-tangkapan membuat pola yang bekerja dapat bertahan bagi pembaca berikutnya.
Hormati catastrophic backtracking
Engine regex JavaScript melakukan backtrack: ketika kecocokan gagal, ia mencoba ulang dengan panjang berbeda untuk setiap quantifier. Quantifier bersarang seperti (a+)+ pada string nyaris-cocok membuat jumlah percobaan meledak secara eksponensial—pola yang menjawab instan pada input baik bisa berjalan bertahun-tahun pada input buruk. Penyerang menyebutnya ReDoS.
Penguji Regex JavaScript membatasi radius ledakan: pola dieksekusi di Web Worker khusus dengan anggaran 650 milidetik, dan ekspresi yang lepas kendali dilaporkan sebagai timeout eksplisit alih-alih membekukan tab. Jika pola Anda menyentuh langit-langit itu pada input realistis, perlakukan sebagai temuan—input yang sama di produksi akan menghentikan event loop.
- Quantifier bersarangBentuk klasiknya adalah grup berquantifier yang berisi token berquantifier—(a+)+, (\w+)*—di mana banyak partisi dari string yang sama semuanya memenuhi pola dalam.
- Alternasi ambiguAlternasi ambigu juga memicunya: (a|aa)+ memberi engine dua cara mencocokkan setiap karakter tambahan, menggandakan pohon pencarian per karakter.
- Perbaikan strukturalPerbaikannya struktural: buat kecocokan dalam tidak ambigu, batasi dengan batas panjang eksplisit, dan selalu uji input nyaris-cocok, bukan hanya yang valid.
Beri anchor sebelum mempercayai kecocokan
Pola yang menemukan substring bukanlah pola yang memvalidasi nilai. /\d+/ cocok di dalam abc123xyz; /^\d+$/ hanya menerima digit. Kebanyakan bug validasi adalah anchor yang hilang, dan kebanyakan bug ekstraksi adalah anchor yang seharusnya tidak ada.
- Awal dan akhir^ dan $ memaku kecocokan ke awal dan akhir string—atau ke setiap baris ketika flag multiline aktif, yang diam-diam mengubah arti “seluruh input”.
- Batas kataBatas kata \b mencegah pola pendek mencocok di dalam kata yang lebih panjang: \bcat\b menemukan hewannya, bukan cat dalam concatenate.
- Cari vs validasiPutuskan cari-versus-validasi sejak awal: pola ekstraksi biasanya tidak mau anchor, validator hampir selalu mau keduanya.
Uji dengan data sampel realistis
Pola yang terbukti pada tiga contoh rapi gagal di produksi pada contoh nyata keempat. Bangun set sampel yang mencerminkan distribusi input: nilai sah terpanjang, string kosong, varian whitespace, nama Unicode, dan nyaris-cocok yang hampir harus cocok tetapi tidak boleh.
- Nyaris-cocokSertakan nyaris-cocok: pola email harus diuji terhadap a@b dan a b@c.d, bukan hanya alamat yang well-formed.
- UnicodeSertakan Unicode di tempat data memilikinya: \w dan . berubah makna di bawah flag u, dan nama beraksen meruntuhkan asumsi era ASCII.
- Jalankan ulang setSimpan set sampel di sebelah pola; ketika pola berubah, jalankan ulang seluruh set, bukan hanya kasus yang memotivasi perubahan.
Flag mengubah bahasa, bukan hanya pencarian
Flag adalah bagian dari makna pola. g menentukan apakah Anda mendapat kecocokan pertama atau semuanya, i melipat huruf besar-kecil, m meng-anchor ulang ^ dan $ ke baris, s membiarkan titik menyeberangi newline, dan u mengalihkan engine ke mode sadar-Unicode dengan sintaks lebih ketat.
Workspace mengevaluasi pola dengan flag yang Anda pilih dan mendaftar setiap kecocokan dengan offset awal dan akhirnya, grup tangkapan bernomor dan bernama dengan posisinya masing-masing, serta pratinjau penggantian langsung—sehingga perubahan flag tampak sebagai perbedaan konkret pada hasil, bukan sebagai teori.
- g dan lastIndexTanpa g, test() dan match() hanya melihat hit pertama; dengan g, objek regex membawa status lastIndex yang membuat panggilan test() berulang bergantian hasil—bug produksi yang termasyhur.
- s memperlebar titiks (dotAll) membuat . mencocokkan newline, yang dapat diam-diam memperlebar selera pola lama ketika diaktifkan secara global.
- u dan kawanu membuat kelas dan escape benar-Unicode serta menolak sintaks warisan yang ambigu; penguji juga mendukung d (indeks kecocokan), y (sticky), dan v (himpunan Unicode).
Jaga pola dan sampel tetap lokal
Data uji sering kali data nyata: email pelanggan, baris log internal, identifier dari laporan insiden. Menempelkannya ke penguji terhosting berarti mengirimnya ke infrastruktur orang lain. Penguji berbasis peramban menjaga sesi tetap di tab—pola dan teks sampel dievaluasi oleh engine perangkat Anda sendiri dan tidak pernah ditransmisikan.
Runtime lokal ini eksplisit soal batasnya: pola hingga 4.096 karakter, teks sampel hingga 100.000 karakter, penggantian hingga 20.000, dan paling banyak 1.000 kecocokan yang dilaporkan per run. Batas itu disesuaikan untuk pengembangan dan debugging; analisis log massal adalah milik skrip lokal, bukan tab peramban.
Salin hanya yang Anda butuhkan—pola jadi dan string pengganti—dan biarkan data sampel tetap di tempat ia bermula: di mesin Anda.
Uji pola secara lokalData hasil ekstraksi biasanya bermuara di JSON.
Setelah pola menarik nilai dari teks mentah, periksa dan diff payload yang dihasilkan dengan rutinitas lokal yang deterministik.