Regex Pola Perpustakaan
Lebih dari 60 pola regex siap pakai. Cari, salin, dan uji online.
Tentang pustaka ini
Ini adalah koleksi yang diatur dan dapat dicari dari lebih dari 60 pola ekspresi reguler yang umum digunakan, dikelompokkan berdasarkan kategori. Setiap pola mencakup deskripsi, ekspresi itu sendiri, dan contoh kecocokan. Klik pola untuk menyalinnya, atau gunakan panel uji cepat untuk memvalidasi teks terhadapnya langsung di halaman ini.
Semuanya berjalan di browser Anda · tidak ada pola atau teks uji yang dikirim ke mana pun. Gunakan pola-pola ini di JavaScript, Python, PHP, Java, Go, atau bahasa apa pun yang mendukung ekspresi reguler. Untuk pengujian yang lebih lanjut dengan flag dan grup capture, coba Regex Penguji & Debugger kami.
Cara kerjanya
- Telusuri atau cari: telusuri pola berdasarkan kategori (validasi, ekstraksi, pemformatan) atau cari berdasarkan nama atau kasus penggunaan.
- Pratinjau pola: setiap entri menampilkan regex, deskripsi apa yang ditangkap, contoh input dengan kecocokan, dan batasan.
- Uji dengan data Anda: masukkan string uji Anda sendiri untuk memverifikasi bahwa pola menangkap apa yang Anda harapkan.
- Salin untuk digunakan: salin pola regex dalam format JavaScript, Python, atau POSIX untuk kode Anda.
Mengapa menggunakan pustaka regex?
Menulis ekspresi reguler dari awal memakan waktu dan rentan kesalahan. Pola yang sering dibutuhkan untuk memvalidasi email, mencocokkan URL, mengekstrak nomor telepon, mendeteksi kartu kredit, mengurai tanggal, atau memvalidasi alamat IP memiliki solusi yang sudah terbukti, tetapi menemukan versi yang andal memerlukan pencarian di Stack Overflow, mengevaluasi kebenarannya, dan memverifikasi kasus tepinya. Pustaka ini mengumpulkan pola yang diverifikasi dengan kasus tepi yang didokumentasikan, batasan yang diketahui, dan kasus uji konkret. Lebih cepat daripada menulis sendiri dan lebih andal daripada menyalin-tempel dari sumber Internet acak tanpa pengujian.
Kategori pola
- Validasi, email, URL, nomor telepon, kartu kredit, alamat IP, kode pos
- Ekstraksi, tanggal, mata uang, hashtag, sebutan, nama domain
- Pemformatan, normalisasi spasi, pemformatan angka, pembuatan slug
- Keamanan, kekuatan kata sandi, deteksi injeksi SQL, pola XSS
- Kode, tag HTML, komentar, nama variabel, nilai CSS
Dari mana ekspresi reguler berasal
Ide matematis tentang «himpunan reguler» diformalkan oleh Stephen Cole Kleene pada tahun 1951 dalam memorandum penelitian RAND Representation of Events in Nerve Nets and Finite Automata. Operator * pada halaman ini masih disebut bintang Kleene untuk menghormatinya. Ken Thompson mengubah teori menjadi algoritma dalam makalah Juni 1968 di Communications of the ACM, Programming Techniques: Regular Expression Search Algorithm, dan mengirimkan implementasi regex pertama di editor QED di Bell Labs. Pada tahun 1973, mesin yang sama menggerakkan ed, kemudian grep (perluasan literal adalah «globally search for regular expression and print»), sed, dan awk. Perl (1987) dari Larry Wall dan terutama Perl 5 (1994) menambahkan grup bernama, lookaround, kuantifier tidak serakah dan penanganan Unicode yang menjadi dialek de facto yang dikenal sebagai PCRE, diporting ke C sebagai library oleh Philip Hazel pada tahun 1997.
Varian mesin dan apa yang berubah di antara mereka
Pola yang berjalan dengan rapi di JavaScript dapat gagal secara diam-diam di Go dan ditolak sepenuhnya di POSIX. Lima varian yang paling mungkin ditemui pengembang:
- POSIX BRE / ERE (IEEE Std 1003.2-1992): dialek
grep,sed, danawkpada sistem Unix standar. Tidak ada lookaround, tidak ada grup bernama, tidak ada escape properti Unicode. BRE juga memerlukan escape(,),{,}, dan|. - PCRE2 (Philip Hazel, 1997, versi mayor saat ini 10.x): dialek terlengkap fiturnya. Lookaround, grup bernama
(?<name>...), grup atomik, kuantifier posesif, rekursi. Digunakan oleh PHPpreg_*, Apache, nginx, R. - Regex ECMAScript (ECMA-262, regex bagian 22.2): dialek JavaScript. ES2018 menambahkan grup bernama, lookbehind, dan flag
s(dotAll) sertau(Unicode). ES2022 menambahkan flagduntuk indeks kecocokan. ES2024 menambahkan flagvdengan kelas notasi himpunan. - Python
re: dekat dengan PCRE, tetapi menggunakan(?P<name>...)untuk grup bernama (PEP 433) dan mode verbose yang berbedare.X. Modul pihak ketiga yang lebih baruregexmenambahkan pola rekursif dan semantik kecocokan terpanjang POSIX. - RE2 (Russ Cox, 2010): mesin di balik
regexpGo dan crateregexRust. Tidak ada lookaround, tidak ada backreference, tidak ada kuantifier posesif, sengaja. Tradeoff: waktu linier terjamin, tidak ada backtracking katastrofik. Jika pola dari library ini menggunakan(?=...)atau\1, itu tidak akan terkompilasi di Go.
Backtracking katastrofik dan ReDoS
Sebagian besar mesin regex dalam bahasa-bahasa utama (PCRE, Java, JS V8 / SpiderMonkey / JavaScriptCore, Python re, .NET) adalah mesin backtracking. Ketika pola dengan kuantifier bersarang seperti (a+)+ menemui input yang hampir cocok, mesin dapat mencoba sejumlah eksponensial jalur alternatif sebelum menyerah. Inilah backtracking katastrofik, dan menjadi dasar kelas serangan ReDoS (Regular expression Denial of Service) yang dikatalogkan oleh OWASP.
Stack Overflow, 20 Juli 2016: sebuah pola yang dirancang untuk memotong spasi awal dan akhir, diterapkan pada badan pertanyaan yang berisi 20 000 karakter spasi berurutan, menghabiskan 11 menit CPU per permintaan dan membuat situs tidak responsif selama 34 menit. Post-mortem di blog resmi Stack Status merekomendasikan untuk mengganti regex pemotongan dengan trim string native.
Cloudflare, 2 Juli 2019: aturan WAF yang mengandung pola kuantifier bersarang .*(?:.*=.*) diterapkan secara global dan mengkonsumsi 100% CPU di setiap server edge selama 27 menit, membuat sebagian besar internet publik offline. Post-mortem Cloudflare di blog mereka memberikan kredit kepada peralihan ke crate regex Rust (mesin berbasis RE2, waktu linier) karena mencegah perulangan.
Pelajaran defensif: hindari kuantifier bersarang ((a+)+, (a*)*, (a|aa)+); hindari pemotongan gaya \s+$ pada input yang dikendalikan penyerang; pilih grup atomik (?>...) atau kuantifier posesif a++ di PCRE; dan untuk layanan throughput tinggi, pertimbangkan mesin berbasis RE2.
Email, URL, telepon, tanggal, kartu kredit: kapan tidak menggunakan regex
Email. Tata bahasa lengkap dari RFC 5322 (Oktober 2008) terkompilasi menjadi regex sekitar 3 000 karakter. Spesifikasi HTML5 W3C untuk validasi <input type="email"> menggunakan regex yang jauh lebih pendek «apakah-ini-tampak-seperti-email» yang merupakan titik awal yang tepat untuk petunjuk sisi klien. RFC 6531 (Februari 2012) mengizinkan alamat non-ASCII seperti 用户@example.com, yang akan ditolak secara keliru oleh regex hanya ASCII. Konsensus industri sejak RFC 6532: jangan validasi email dengan regex, kirim email verifikasi sebagai gantinya.
URL. RFC 3986 (Januari 2005) adalah spec sintaks URI generik, tetapi WHATWG URL Living Standard sengaja menyimpang darinya untuk mencocokkan apa yang sebenarnya diterima browser. Gunakan new URL("...") di JavaScript atau urllib.parse di Python alih-alih regex untuk apa pun yang melampaui pemeriksaan visual cepat.
Nomor telepon. Rekomendasi ITU-T E.164 (revisi saat ini November 2010) mengizinkan hingga 15 digit dengan awalan + opsional, tetapi aturan spesifik negara sangat bervariasi. Library open-source Google libphonenumber mengkodekan aturan per negara untuk setiap wilayah dan merupakan satu-satunya validator lintas-negara yang dapat diandalkan.
Tanggal. Regex seperti ^\d{4}-\d{2}-\d{2}$ cocok dengan format kalender ISO 8601-1:2019, tetapi juga menerima 2026-02-31. Validitas tanggal memerlukan logika kalender, bukan pencocokan pola; gunakan Date.parse() atau library tanggal.
Kartu kredit. Regex dapat mencocokkan panjang digit dan awalan IIN (Visa dimulai dengan 4, Mastercard dengan 51-55 atau 2221-2720, Amex dengan 34 atau 37) tetapi tidak dapat memverifikasi checksum Luhn (Hans Peter Luhn, IBM, Paten AS 2 950 048 diberikan Agustus 1960). Luhn memerlukan penjumlahan digit demi digit modulo 10.
Cara umum pengembang menggunakan library ini
- Petunjuk formulir sisi klien, dengan pemahaman bahwa kecocokan regex adalah petunjuk, bukan validasi akhir.
- Pengikisan log, menarik timestamp, IP, kode kesalahan, dan URL dari log aplikasi ke dalam pipeline.
- Pembersihan data sekali pakai: menormalkan spasi, mencopot tag HTML, mengonversi antar format tanggal, slugify judul.
- Cari-ganti di editor di VS Code, Sublime, vim, IntelliJ di mana varian regex dekat dengan PCRE.
- Pola pencocokan router dan URL di Express, Flask, FastAPI, Rails.
- Aturan WAF dan deteksi intrusi, dengan kehati-hatian ekstrem terhadap ReDoS seperti yang ditunjukkan insiden Cloudflare 2019.
- Pengujian string cepat di panel pengujian bagian bawah halaman, sebelum mengkommit pola ke kode.
Kesalahan umum
- Melupakan jangkar. Tanpa
^dan$(atau\Adan\zdi PCRE), regex validasi cocok jika pola muncul di mana saja dalam string./\d{4}/cocok dengan«year 2026 was good», yang hampir tidak pernah merupakan yang diinginkan. - Mempercayai
.*melintasi beberapa hal.<a href=".*">pada input<a href="a"><a href="b">menangkap melintasi kedua tag karena.*serakah. Gunakan.*?untuk lazy, atau lebih baik, parsing dengan parser sebenarnya. - Mengasumsikan titik cocok dengan baris baru. Secara default
.cocok dengan semuanya kecuali terminator baris. Gunakan flags(dotAll) di JS, ataure.DOTALLdi Python, atau modifier inline(?s)di PCRE. - Mengasumsikan
\wtermasuk huruf non-ASCII. Dalam mode ASCII,\wadalah[a-zA-Z0-9_]. Tambahkan flagudi JS (ES2018+) dan gunakan\p{L}untuk huruf Unicode apa pun; di Python tambahkanre.UNICODE(default di Python 3). - Backreference di Go.
regexpGo adalah RE2 dan menolak\1pada waktu kompilasi. Kesalahan«error parsing regexp: invalid escape sequence: \1»berarti pola perlu dibagi menjadi pendekatan non-regex. - Parsing HTML dengan regex. Terkenal tidak layak: HTML bukan bahasa reguler. Gunakan parser DOM (
DOMParserbawaan browser, cheerio, BeautifulSoup, lxml).
Pertanyaan yang lebih sering diajukan
Mengapa beberapa pola menggunakan (?:...) alih-alih (...)?
(?:...) adalah grup non-capturing: ia mengelompokkan untuk pengulangan atau alternasi tetapi tidak mengalokasikan slot backreference. Ini lebih cepat dan menghindari mencemari $1, $2 dalam array hasil. Gunakan (...) ketika Anda perlu mengekstrak teks yang ditangkap; gunakan (?:...) hanya untuk pengelompokan.
Apa flag regex yang paling umum?
i tidak peka huruf besar/kecil, g global (temukan semua, perilaku khusus JS), m multiline (sehingga ^ dan $ cocok dengan batas baris), s dotAll (sehingga . cocok dengan baris baru, ES2018+), u Unicode (ES2015+), y sticky (ES2015+), d hasIndices (ES2022+), v kelas notasi himpunan (ES2024+). Gabungkan sebagai /pattern/gimsu.
Bagaimana cara mencocokkan karakter khusus literal?
Lepaskan dengan backslash. Metakarakter regex yang perlu di-escape untuk pencocokan literal adalah: . ^ $ * + ? ( ) [ ] { } | \ /. Di dalam kelas karakter [...] himpunan karakter khusus lebih kecil: hanya ] \ ^ - perlu di-escape, tergantung posisi.
Bisakah saya menggunakan pola library ini di skrip shell?
Ya, dengan peringatan. grep menggunakan POSIX BRE secara default; grep -E menggunakan ERE; grep -P menggunakan PCRE di sistem di mana libpcre tertaut (GNU grep, macOS grep dengan Homebrew). Pola yang menggunakan lookaround, grup bernama, atau escape Unicode memerlukan grep -P atau ripgrep (yang menggunakan mesin RE2-based Rust dan menolak lookaround).
Apakah pola-pola ini dikirim ke server?
Tidak. Setiap regex di halaman ini, setiap pencarian yang Anda ketik, dan setiap string yang Anda uji di panel uji cepat diproses di mesin JavaScript browser Anda. Tidak ada panggilan jaringan yang dilakukan. Data pola itu sendiri dikirim sebagai file JSON statis di bundle halaman. Buka tab Jaringan di DevTools untuk memverifikasi.