Alat yang Anda butuhkan, siap dipakai

Penguji Regex

Masukkan regex ke kolom pola, dan bagian yang cocok pada teks di bawahnya langsung diwarnai, sementara pola diuraikan arti tiap bagiannya. Grup tangkapan tersambung lewat warna menjadi kolom di tabel kecocokan, dan tab Ganti menampilkan hasil penggantian dengan $1 atau $<nama> beserta posisi yang berubah. Untuk pola validasi input, nyalakan 'Periksa per baris' agar banyak contoh bisa diuji sekaligus.

Terakhir diperbarui 2026-10-22Semua perhitungan terjadi di browser Anda
Contoh

Sintaks JavaScript, tanpa garis miring di awal dan akhir

Bedah pola

Terakhir diperbarui 2026-10-22Masukan Anda tidak disimpan

Standar ROBERINAlat yang Anda butuhkan,
siap dipakai.
  • Jelas sekilasPosisi input dan hasil terlihat jelas.
  • Hasil lebih duluAngka utama tampil dulu; prosesnya hanya saat dibutuhkan.
  • Minta lebih sedikitTanpa pendaftaran atau data yang tidak perlu.

Regex tester menunjukkan langsung di mana pola cocok dengan teks

Ekspresi reguler (regular expression, sering disingkat regex) adalah aturan yang menuliskan bentuk yang dicari dalam teks memakai simbol. \d{4} berarti 'empat angka', sedangkan [aiueo]+ berarti 'satu vokal atau lebih'. Aturannya singkat, tetapi satu simbol saja bisa mengubah cakupan pencarian dengan besar. Karena itu pola perlu dicoba pada teks sungguhan sebelum dimasukkan ke kode.

Alat ini menjalankan pola dengan mesin regex JavaScript di browser yang Anda pakai. Bagian yang cocok langsung diwarnai di atas teks, dan grup tangkapan dibedakan dengan warna lalu dirangkum menjadi kolom di tabel kecocokan. Pola juga diuraikan arti tiap bagiannya, sehingga alat ini berguna untuk memahami regex yang ditulis orang lain.

Mengapa pola regex perlu diuji sebelum masuk ke kode

Regex bisa salah dengan dua cara. Pertama, ia melewatkan yang seharusnya ditemukan (pemeriksa nomor ponsel menolak 081234567890 yang tanpa tanda hubung). Kedua, ia menangkap yang tidak seharusnya (pola tanggal menerima 2026-13-45). Keduanya bukan galat sintaks, sehingga browser tidak memberi peringatan apa pun. Cara paling pasti adalah memasukkan contoh yang harus cocok bersama contoh yang tidak boleh cocok.

Masalah ketiga adalah kecepatan. Pada 2 Juli 2019, Cloudflare menerapkan regex baru pada aturan WAF (web application firewall). Backtracking melonjak, CPU untuk pemrosesan HTTP hampir 100%, dan layanan berhenti selama 27 menit. Menurut laporan yang mereka terbitkan, penyebabnya adalah bagian pendek .*(?:.*=.*) di dalam pola yang panjang. Dua pola yang mencari teks yang sama bisa berbeda ratusan kali lipat dalam jumlah percobaan, tergantung cara penulisannya. Karena itu ujilah dengan teks yang panjangnya sungguhan.

Situasi saat menguji regex lebih dulu sangat membantu:

  • Validasi input: saat menentukan syarat nomor telepon, email, dan kata sandi pada formulir pendaftaran, masukkan contoh yang harus lolos dan yang harus ditolak, satu per baris.
  • Mengambil nilai: saat menyaring tanggal, nomor pesanan, atau alamat IP dari log, CSV, atau tabel salinan, periksa apakah nilai grup terpecah dengan benar. Tabel kecocokan bisa langsung ditempel ke spreadsheet.
  • Ganti massal: sebelum menjalankan cari dan ganti di editor atau kode, lihat lebih dulu bagian yang berubah dan hasilnya.
  • Membaca regex orang lain: uraikan apa yang dicari pola pada kode lama, lalu periksa apakah ada bentuk yang bisa lambat.

Cara memakai

  1. Masukkan regex ke kolom Pola. Garis miring di awal dan akhir tidak perlu ditulis. Jika Anda menempel literal utuh seperti /abc/gi, alat ini memisahkannya menjadi pola dan flag.
  2. Nyalakan flag dengan tombol huruf di sebelah kanan. Nyalakan g untuk mencari di banyak tempat.
  3. Tempel teks ke kolom Teks yang diuji. Bagian yang cocok langsung diwarnai, dan jumlah kecocokan muncul di baris status di atasnya.
  4. Untuk pola validasi input (^…$), nyalakan Periksa per baris dan masukkan satu contoh per baris. Baris yang lolos diberi ✓, yang tidak lolos diberi ✗.
  5. Lihat nilai grup di tabel kecocokan di bawahnya; menekan tombol nomor membuat kecocokan itu berkedip di teks. Tab Ganti menampilkan hasil penggantian dari teks pengganti yang Anda isi, dan tab Kode membawa pola ke kode JavaScript.

Cara membaca baris bedah pola

Baris bedah pola memecah pola menjadi satuan yang dibaca mesin regex. Di atas tiap kotak tertulis simbol aslinya, dan di bawahnya artinya. Pengulang (+, {4}, dan sebagainya) digabung dengan kotak sebelumnya dan dibaca bersama, misalnya 'angka 4 kali'. Warna garis tebal di bawah kotak menunjukkan grup tangkapan tempat kotak itu berada. Warna yang sama dipakai untuk garis bawah grup di teks dan judul kolom di tabel kecocokan. Kotak bergaris putus-putus adalah pengelompokan yang tidak menyimpan nilai, lookahead dan lookbehind, serta 'atau'.

(?<y>\d{4})-(?<m>\d{2}) setelah dipecah menjadi kotak
KotakArtiWarna grup
(?<y>Awal grup y (grup 1)Warna 1
\d{4}Angka 0~9 sebanyak 4 kaliWarna 1
)Akhir grup yWarna 1
-Tanda hubung apa adanyaTidak ada
(?<m> \d{2} )Grup m: angka 2 kaliWarna 2

Kotak berbingkai oranye adalah bentuk yang bisa membuat eksekusi sangat lambat. Alat ini menandai pengulangan di dalam pengulangan seperti (a+)+ dan pengulangan sama yang berurutan seperti .*.*. Kotak merah menunjuk posisi galat pada pola yang ditolak browser karena sintaks.

Sintaks yang sering dipakai

Kolom 'Yang ditemukan' pada tabel di bawah adalah hasil eksekusi sungguhan pada teks contoh dengan mesin JavaScript yang sama seperti alat ini.

Simbol regex dan hasil contohnya
SimbolArtiContoh polaContoh teksYang ditemukan
\dSatu angka 0~9\d+Blok A no. 102102
\wSatu huruf latin, angka, atau garis bawah (_)\w+ID: pesan_01ID, pesan_01
.Karakter apa pun selain baris barua.cabc a-c a↵cabc, a-c
[ ]Salah satu karakter di dalam kurung; - menandakan rentang[aiueo]+Roberin Jakartao, e, i, a, a, a
[^ ]Satu karakter selain yang ada di dalam kurung[^0-9]+0812-3456-
^ $Awal dan akhir teks (atau baris)^\d+$20262026
{n,m}Bagian sebelumnya diulang n sampai m kali\d{2,3}1 22 333 444422, 333, 444
|Ataukucing|anjinganjing dan kucinganjing, kucing
\bBatas kata (berdasarkan huruf latin dan angka)\bkucing\bkucing kucingankucing
(?= )Lookahead: harus diikuti ini (tidak ikut dalam kecocokan)\d+(?= rupiah)3 buku 5000 rupiah5000
(?<= )Lookbehind: harus didahului ini(?<=\$)\d+$30 and 4030
\1Ulangi teks yang ditangkap grup 1(\w)\1taat maafaa, aa
+? *?Mengulang sesingkat mungkin<.+?><b>x</b><b>, </b>

Hal yang diubah oleh 8 flag

Flag adalah pengaturan yang berlaku untuk seluruh pola. Pola dan teks yang sama bisa memberi hasil berbeda tergantung flag-nya.

Hasil sebelum dan sesudah flag dinyalakan
FlagFungsiContoh pola · teksHasil saat matiHasil saat menyala
gTidak berhenti di kecocokan pertama, cari semuanyaa · a a aaa, a, a
iHuruf besar dan kecil dianggap samaabc · ABCTidak adaABC
m^ $ cocok di setiap baris^\d · 1↵211, 2
s. juga cocok dengan baris barua.b · a↵bTidak adaa↵b
uMembaca emoji dan sejenisnya sebagai satu karakter, serta mengaktifkan \p{…}. · 😀2 separuh😀
vMenambah selisih (--) dan irisan (&&) himpunan karakter di atas u[\p{L}--[a-z]] · aZéGalat sintaksZ, é
yHanya cocok jika langsung menyambung di tempat kecocokan sebelumnya berakhir\d · 12a3 (bersama g)1, 2, 31, 2
dMemberi posisi awal dan akhir (indices) tiap grupHasil pencariannya sama. Alat ini selalu menghitung posisi, apa pun flag-nya, untuk tabel kecocokan.

u dan v tidak bisa dinyalakan bersama. Jika salah satunya dinyalakan, alat ini mematikan yang lain dan memberi tahu di baris status. Sintaks yang baru muncul, seperti flag v dan pengubah seperti (?i:…), bisa menyebabkan galat sintaks di browser lama.

Grup tangkapan, grup bernama, dan referensi balik

Bagian yang dibungkus kurung ( ) menjadi grup tangkapan yang disimpan terpisah di dalam kecocokan. Nomornya 1, 2, 3 menurut urutan kurung buka, dan jika diberi nama seperti (?<y>…), grup itu punya nomor sekaligus nama. Jika hanya ingin mengelompokkan tanpa menyimpan, pakai (?:…). Pengelompokan yang tidak menyimpan tidak memakai nomor, sehingga nomor grup sesudahnya tidak bergeser.

Untuk mencari lagi teks yang ditangkap grup sebelumnya di dalam pola, pakai referensi balik \1 atau \k<nama>. (\w)\1 mencari tempat yang memuat dua karakter sama berurutan. Ingat juga bahwa jika sebuah grup diulang ((\d)+), hanya nilai dari pengulangan terakhir yang tersisa. Sel '—' pada tabel kecocokan menandakan grup yang tidak dipakai pada kecocokan itu (grup 1 pada (a)|(b) ketika b yang cocok), sedangkan 'kosong' berarti grup cocok dengan teks kosong.

Simbol pada teks pengganti

Hasil di tab Ganti dibuat dengan aturan yang sama seperti String.prototype.replace di JavaScript. Tabel di bawah memakai pola (\d{4})-(\d{2})-(\d{2}) pada teks 'Pesanan 2026-10-22 dikirim'.

Simbol pengganti dan hasilnya
SimbolArtiTeks penggantiHasil
$1~$99Grup bernomor$3.$2.$1Pesanan 22.10.2026 dikirim
$<nama>Grup bernama (jika pola punya nama)tgl $<d>, bulan $<m>Pesanan tgl 22, bulan 10 dikirim
$&Seluruh teks yang cocok[$&]Pesanan [2026-10-22] dikirim
$`Seluruh teks sebelum kecocokan($`)Pesanan (Pesanan ) dikirim
$'Seluruh teks setelah kecocokan($')Pesanan ( dikirim) dikirim
$$Satu karakter $$$1Pesanan $1 dikirim
\nBukan baris baru, melainkan karakter \ dan n$1\n$2Pesanan 2026\n10 dikirim

Nomor yang lebih besar daripada jumlah grup ($7) tetap tertulis apa adanya, dan $0 juga tetap sebagai teks, bukan grup. Untuk memasukkan baris baru, tekan Enter di kolom teks pengganti agar baris benar-benar berganti. Di kode, tulis "\n" di dalam string.

Huruf beraksen dan \w

\w dan \b di JavaScript hanya menganggap huruf latin tanpa aksen, angka, dan garis bawah sebagai 'karakter kata'. Menyalakan flag u tidak mengubahnya. Akibatnya \w+ memotong kata seperti 'Café' atau 'résumé' di huruf beraksen, dan \bcafé\b tidak menemukan 'Café' karena é tidak dianggap karakter kata, sehingga tidak ada batas kata setelahnya. Nama dan kata serapan yang beraksen cukup sering muncul, jadi hal ini patut diperhatikan pada validasi nama atau pemisahan kata.

Yang ditemukan pada teks 'Café à la carte, naïve résumé'
PolaYang ditemukanPenjelasan
\w+Caf, la, carte, na, ve, r, sumMemotong kata di setiap huruf beraksen
\p{L}+ (u)Café, à, la, carte, naïve, résuméSemua huruf Unicode, termasuk yang beraksen
[a-zà-ÿ]+Café, à, la, carte, naïve, résuméRentang manual; à-ÿ adalah U+00E0 sampai U+00FF
\bcafé\bTidak ada\b tidak menganggap é sebagai huruf kata

Cara paling ringkas adalah \p{L} dengan flag u, yang mencakup huruf dari semua aksara. Dengan rentang manual seperti [a-zà-ÿ], perhatikan bahwa rentang à-ÿ (U+00E0 sampai U+00FF) juga memuat ÷ (U+00F7). Batas kata sendiri bisa ditulis dengan lookaround, misalnya (?<![\p{L}\p{N}_])…(?![\p{L}\p{N}_]) dengan flag u, yang hanya cocok jika di kiri dan kanannya tidak ada huruf, angka, atau garis bawah.

Kata ulang (reduplikasi) seperti anak-anak atau buku-buku adalah kasus lain. Pola \b(\w+)-\1\b dengan flag gi mencari kata yang diulang di kedua sisi tanda hubung, dan $1 pada tab Ganti meringkasnya menjadi satu kata. Flag i dipakai agar 'Anak-anak' yang berawal huruf besar tetap cocok. Pola ini tidak menyentuh bolak-balik, karena kedua sisinya berbeda.

Beda 'Periksa per baris' dan flag m

Flag m memeriksa seluruh teks sekaligus sambil membuat ^ dan $ cocok di awal dan akhir setiap baris. Karena itu kecocokan bisa melewati batas baris (\s juga cocok dengan baris baru), dan hasilnya hanya berupa 'sekian kecocokan'. Periksa per baris memotong teks per baris dan memeriksa tiap baris sebagai teks yang berdiri sendiri. Kecocokan tidak melewati batas baris, tiap baris mendapat status lolos (✓) atau tidak lolos (✗), dan baris status menampilkan misalnya 'Lolos 3 / 6 baris'. Untuk menguji pola yang memeriksa satu nilai input utuh, seperti pada formulir pendaftaran, dengan banyak contoh, cara ini sama dengan pemakaian sebenarnya. Penggantian juga dilakukan per baris lalu disambung kembali.

Pola lambat dan batas 1 detik

Mesin regex JavaScript mencari jalan yang cocok dengan membatalkan pilihan sebelumnya lalu mencoba jalan lain (backtracking). Pola yang memungkinkan beberapa pengulangan berbagi karakter yang sama akan mencoba semua cara pembagian ketika bertemu teks yang tidak cocok. Laporan Cloudflare meringkas bagian bermasalahnya menjadi .*.*=.* dan mencatat bahwa x=x cocok dalam 23 langkah, teks dengan 20 huruf x setelah x= memerlukan 555 langkah untuk cocok, dan 20 huruf x tanpa = memerlukan 4.067 langkah sebelum dinyatakan tidak cocok. Jika hanya ditambah satu ; di akhir, .*.*=.*;, teks dengan 20 huruf x setelah x= baru gagal setelah 5.353 langkah. Pola (a+)+$, yang punya pengulangan di dalam pengulangan, membuat percobaan kira-kira berlipat dua setiap teks bertambah satu karakter.

Alat ini menjalankan eksekusi di ruang kerja terpisah (Web Worker). Jika tidak selesai dalam 1 detik, pekerjaan dihentikan dan Anda diberi tahu. Layar tidak membeku. Penyebabnya besar kemungkinan kotak oranye di baris bedah pola. Perbaikannya umumnya salah satu dari tiga ini.

  • Hilangkan pengulangan di dalam pengulangan. Gantikan (\w+\s?)+$ dengan \w+(?:\s\w+)*$ agar setiap pengulangan pasti disela karakter lain (di sini spasi).
  • Pakai himpunan yang mengecualikan karakter penghenti sebagai ganti .*. .*.*=.* bisa diubah menjadi [^=]*=.*, yang mencari teks sama dengan hampir tanpa jalan untuk diulang.
  • Gabungkan pilihan yang bisa membagi teks yang sama dengan beberapa cara menjadi satu. (\d|\d\d)+$ mencoba semua cara membagi deretan angka menjadi 1 dan 2 digit, sedangkan \d+$ selesai sekali jalan.

Perbedaan antarbahasa

Sintaks regex sedikit berbeda di tiap bahasa. Hasil alat ini mengikuti JavaScript, jadi periksa perbedaan di bawah saat memindahkan pola ke bahasa lain. Tabel dijalankan langsung di Node.js 26, Python 3.14, dan PHP 8.5 (PCRE2 10.44), sedangkan Java diperiksa dari dokumentasi resmi Java 21.

Perbedaan regex JavaScript dengan Python, Java, dan PHP
HalJavaScriptPython reJavaPHP preg_*
Grup bernama(?<n>…)Hanya (?P<n>…); (?<n>…) menjadi galat(?<n>…)(?<n>…), (?P<n>…)
Grup di teks pengganti$1, $<n>\1, \g<n>$1, ${n}$1, \1, ${1} (nama tidak bisa)
Apakah \w cocok dengan huruf beraksen (é)Tidak (meski u menyala)Ya (bawaan untuk pola string; dengan re.ASCII tidak)Tidak (ya jika UNICODE_CHARACTER_CLASS)Tidak (ya jika /u)
Pengulang posesif a++, grup atomik (?>…)Tidak ada (galat sintaks)Ada (sejak 3.11)AdaAda
Tempat menulis flagHuruf setelah /…/giArgumen seperti re.I; cari semua dengan findall atau subArgumen seperti Pattern.CASE_INSENSITIVEHuruf setelah pembatas /…/iu

Panjang yang boleh ditulis di dalam lookbehind ((?<=…)) juga berbeda. JavaScript menerima pola yang panjangnya tidak tentu seperti (?<=a+), Python hanya menerima panjang tetap, dan PHP sejak PCRE2 10.43 menerima pola dengan batas panjang ((?<=a{1,3}), bawaannya maksimal 255 karakter). \d di Python juga menganggap angka lebar penuh '12' sebagai angka, sedangkan \d di JavaScript hanya 0~9.

Kesalahan yang sering terjadi

  • Menulis garis miring terbalik hanya sekali saat membuat dari string: string JavaScript "\d+" menjadi d+. Tulislah dua kali seperti new RegExp("\\d+"). Baris 'Jika dibuat dari string' di tab Kode sudah berbentuk seperti itu.
  • Menulis titik apa adanya: 1.5 juga cocok dengan '125'. Untuk karakter titik itu sendiri, tulis 1\.5.
  • Memanggil test() berulang pada regex berflag g: regex mengingat posisi terakhirnya (lastIndex), sehingga hasil untuk teks yang sama bergantian true, false, true. Jika hanya memeriksa, lebih aman tanpa g.
  • .* yang serakah: <.+> menangkap seluruh '<b>x</b>' sekaligus. Untuk menangkap tag satu per satu, pakai <.+?> atau <[^>]+>.
  • Memakai pola validasi langsung pada teks banyak baris: tanpa flag m, ^…$ memandang seluruh teks sebagai satu gumpalan, sehingga teks banyak baris menghasilkan 0 kecocokan. Untuk menguji banyak contoh, nyalakan Periksa per baris.
  • Berusaha memeriksa email dengan satu regex secara sempurna: alamat yang diizinkan standar sangat beragam, jadi pola sederhana melewatkan sebagian atau menerima yang berlebih. Pola email pada contoh hanya menyaring bentuknya secara kasar, dan pemastian sebenarnya lazim dilakukan dengan email verifikasi.

Batasan

  • Hasil mengikuti mesin regex JavaScript di browser yang sedang dipakai. Regex di Python, Java, PHP, dan editor bisa berbeda sintaks dan hasilnya seperti pada tabel di atas.
  • Batasnya 1.000 karakter untuk pola, 50.000 karakter untuk teks yang diuji, 2.000 karakter untuk teks pengganti, dan 200.000 karakter untuk hasil penggantian. Tabel kecocokan dan warna di teks hanya menampilkan 1.000 kecocokan pertama, sedangkan jumlah kecocokan dan hasil penggantian mencakup semuanya.
  • Eksekusi dihentikan jika melebihi 1 detik. Di perangkat yang lambat, pola yang sama bisa memakan waktu lebih lama.
  • Tanda 'Bisa lambat' di baris bedah pola hanyalah peringatan yang mencari bentuk yang umum. Tidak adanya tanda tidak menjamin pola cepat pada semua teks.
  • 'Baris:kolom' di tabel kecocokan memakai posisi string JavaScript (UTF-16), sehingga satu emoji dihitung dua posisi.
  • Pola dan teks yang Anda masukkan hanya diproses di dalam browser dan tidak dikirim ke server. Tidak ada yang disimpan di alamat atau penyimpanan, sehingga memuat ulang halaman mengembalikan contoh awal.

Acuan: sintaks dan aturan penggantian diperiksa pada 22 Oktober 2026 dari spesifikasi ECMAScript dan MDN, sedangkan bahasa lain dari dokumentasi resmi Python, Java, PHP, dan catatan perubahan PCRE2. Contoh pada tabel dijalankan di Node.js 26 (V8), Python 3.14, dan PHP 8.5, dan hasilnya sama.

Sumber

Pertanyaan yang sering diajukan

Bolehkah saya menempel pola lengkap dengan / dan flag?

Di kolom pola, isi hanya bagian di dalam garis miring, lalu nyalakan flag dengan tombol huruf di sebelah kanan. Jika Anda menempel literal utuh seperti /abc/gi, alat ini memisahkannya menjadi pola abc dan flag g, i. Jika garis miring diketik sendiri, ia dibaca sebagai karakter yang dicari.

Mengapa hanya satu tempat yang diwarnai padahal banyak yang cocok?

Jika flag g mati, pencarian berhenti di kecocokan pertama. Baris status juga menampilkan jumlah kecocokan jika g dinyalakan, jadi tekan tombol g untuk mencari semuanya.

Mengapa \w tidak cocok dengan huruf beraksen seperti é atau à?

\w di JavaScript hanya menerima huruf latin tanpa aksen, angka, dan garis bawah, dan flag u tidak mengubahnya. Akibatnya 'Café' terpotong menjadi 'Caf'. Pakai \p{L} dengan flag u untuk semua huruf, atau rentang manual seperti [a-zà-ÿ]. \b juga tidak menganggap é sebagai karakter kata.

Apa beda flag m dan 'Periksa per baris'?

Flag m memeriksa seluruh teks sekaligus dan membuat ^ serta $ cocok di tiap baris. 'Periksa per baris' memeriksa setiap baris sebagai teks yang berdiri sendiri dan menandai lolos atau tidaknya per baris. Untuk menguji pola yang memeriksa satu nilai input dengan banyak contoh, pilih 'Periksa per baris'.

Bagaimana memasukkan nilai grup ke teks pengganti?

Grup bernomor ditulis $1, $2, grup bernama $<nama>, dan seluruh kecocokan $&. Tombol simbol di tab Ganti menyisipkannya di posisi kursor. \n tidak menjadi baris baru, melainkan dimasukkan apa adanya, jadi tekan Enter jika ingin berganti baris.

Jika berhenti karena batas 1 detik, apakah polanya salah?

Sintaksnya bisa benar, tetapi bentuknya mungkin memicu lonjakan backtracking. Pengulangan di dalam pengulangan seperti (a+)+ atau pengulangan sama yang berurutan seperti .*.* membuat percobaan melonjak pada teks panjang yang tidak cocok. Lihat kotak oranye di baris bedah pola, lalu gabungkan pengulangan atau pakai himpunan sempit seperti [^=]* sebagai ganti .*.

Apakah hasilnya sama di Python, Java, dan PHP?

Sintaks dasarnya mirip, tetapi ada perbedaan. Python menulis grup bernama sebagai (?P<nama>…) dan \w-nya menerima huruf beraksen, sedangkan PHP menerima huruf beraksen pada \w jika memakai /u. Penulisan grup di teks pengganti juga berbeda, seperti \1 dan ${nama}. Lihat tabel 'Perbedaan antarbahasa' di artikel.

Apakah teks yang saya masukkan dikirim ke server?

Tidak. Pola dan teks hanya dijalankan di ruang kerja (Web Worker) dalam browser, dan tidak disimpan di alamat atau penyimpanan. Memuat ulang halaman mengembalikan contoh pertama.