UltKit

Penguji Regex

Taipkan corak, tandakan bendera yang Anda perlukan dan tampal sedikit teks: setiap padanan diserlahkan semasa Anda menaip dan disenaraikan bersama kedudukan serta kumpulan tangkapannya. Corak dijalankan pada enjin regex JavaScript pelayar Anda sendiri, jadi hasilnya sepadan dengan kod Anda dan teks kekal pada peranti Anda.

Bendera

0 aksara · 0 perkataan · 0 baris

Padanan diserlahkan di sini.

0 aksara · 0 perkataan · 0 baris

Berjalan sepenuhnya dalam tab pelayar ini. Teks Anda tidak pernah dimuat naik atau disimpan.

Token regex JavaScript

Lajur padanan pertama dihasilkan dengan menjalankan setiap corak pada teksnya menggunakan enjin JavaScript yang membina halaman ini.

TokenMaksudCorakTeksPadanan pertama
\dDigit 0–9/\d+/Order 66 shipped66
\wHuruf, digit atau garis bawah (ASCII)/\w+/snake_case-idsnake_case
\sRuang kosong, termasuk tab dan pemisah baris/\s+/two spaces
.Sebarang aksara kecuali pemisah baris (kecuali s)/a.c/abc a-cabc
^ $Awal dan akhir input (atau baris, dengan m)/^\w+$/singlesingle
[abc]Salah satu aksara yang disenaraikan/[aeiou]/rhythm and bluesa
[^abc]Sebarang aksara yang tidak disenaraikan/[^0-9]+/2026-10-18-
* + ?0 atau lebih, 1 atau lebih, 0 atau 1/colou?r/color colourcolor
{n,m}Antara n dan m kali/\d{2,4}/7 42 1999 12345642
(…)Kumpulan penangkap/(\d+)px/width: 320px320px
(?<name>…)Kumpulan penangkap bernama/(?<h>\d\d):(?<m>\d\d)/at 09:4509:45
(?:…)Kumpulan tanpa penangkapan/(?:ab)+/ababab!ababab
a|bMana-mana sebelah/cat|dog/hotdogdog
\bSempadan perkataan/\bcat\b/concat catcat
(?=…)Diikuti oleh (lookahead)/\d+(?=%)/50 of 75%75
(?<!…)Tidak didahului oleh (negative lookbehind)/(?<!\$)\b\d+/$30 or 4040
\p{L}Sebarang huruf Unicode (perlu u)/\p{L}+/unaïve 東京naïve

Enam bendera dan kesannya

g (global) mencari setiap padanan dan bukan berhenti pada yang pertama; tanpanya senarai hanya mengandungi satu entri. i mengabaikan huruf besar/kecil. m (multiline) menjadikan ^ dan $ sepadan pada permulaan dan penghujung setiap baris, bukan hanya pada keseluruhan teks, yang sesuai untuk corak seperti ruang di hujung baris. s (dotAll, ditambah dalam ES2018) membenarkan . sepadan dengan pemisah baris juga. u (unicode) menganggap teks sebagai titik kod, jadi emoji dikira sebagai satu aksara, dan mengaktifkan escape sifat seperti \p{L} untuk sebarang huruf dalam mana-mana skrip. y (sticky) hanya sepadan tepat pada kedudukan semasa, mod yang digunakan oleh tokenizer. JavaScript juga mempunyai d untuk indeks padanan dan v untuk operasi set dalam kelas; penguji ini hanya menyokong enam bendera di atas.

Di bawah teks ujian, setiap padanan memaparkan indeks dan kumpulannya. Kumpulan bernombor datang daripada kurungan biasa, (?:…) ialah kumpulan tanpa tangkapan, dan (?<year>\d{4}) mencipta kumpulan bernama yang dipaparkan mengikut nama, seperti ditunjukkan oleh contoh tarikh ISO. Menu Corak biasa memasukkan titik permulaan yang telah diuji untuk alamat e-mel, URL, alamat IPv4, warna hex, UUID, perkataan berulang dan ruang di hujung baris. Anggap corak e-mel sebagai semakan kasar, bukan pengesahan: tatabahasa alamat penuh jauh lebih longgar, dan satu-satunya ujian sebenar ialah menghantar mesej.

Lookbehind dan backtracking katastrofik

Lookaround menguji apa yang mengelilingi sesuatu kedudukan tanpa menggunakannya. Lookahead, (?=…) dan (?!…), sentiasa wujud dalam JavaScript; lookbehind, (?<=…) dan (?<!…), hadir dalam ES2018 dan sampai ke setiap pelayar utama apabila Safari 16.4 melancarkannya pada 2023. Jadi (?<=\$)\d+ mencari 42 dalam "$42" tanpa menyertakan tanda dolar. Tidak seperti banyak enjin lain, JavaScript membenarkan lookbehind dengan panjang apa pun.

Enjin JavaScript menggunakan backtracking: apabila satu laluan gagal, ia berundur dan mencuba alternatif. Pengkuantiti bersarang seperti (a+)+$ memberinya bilangan cara eksponen untuk membahagi teks yang sama, jadi rentetan 30 huruf a diikuti x boleh mengambil masa beberapa saat dan beberapa huruf lagi boleh mengambil masa berjam-jam. Ini ialah catastrophic backtracking, dan pada pelayan ia menjadi ReDoS, iaitu penafian perkhidmatan; satu peraturan WAF dengan kelemahan ini pernah menjatuhkan rangkaian Cloudflare selama kira-kira setengah jam pada 2 Julai 2019. Oleh sebab penguji ini berjalan dalam tab anda, corak sebegini boleh membekukan halaman; muat semula dan tulis semula supaya tiada dua pengkuantiti boleh menuntut aksara yang sama, dengan menggunakan kelas yang lebih ketat seperti [^,]* dan bukan .*, atau sauh. Untuk menyunting teks itu sendiri dan bukan memadankannya, lihat alat teks; utiliti pembangun lain terdapat dalam hab alat pembangun.

Soalan lazim

Mengapakah regex saya hanya menemui satu padanan?
Bendera g tidak dihidupkan. Tanpanya, enjin berhenti selepas padanan pertama. Tandakan g untuk menyenaraikan setiap kemunculan; bendera y sahaja juga menemui beberapa padanan, tetapi hanya apabila ia datang berturut-turut secara langsung.
Adakah \d memadankan digit daripada tulisan lain dalam JavaScript?
Tidak. Dalam JavaScript \d hanya bermaksud 0 hingga 9 dan \w hanya huruf ASCII, digit dan garis bawah, walaupun dengan bendera u. Gunakan \p{Nd} atau \p{L} dengan u untuk skrip lain.
Adakah corak yang diuji di sini berkelakuan sama dalam Python atau PHP?
Sintaks asas boleh digunakan semula, tetapi butirannya berbeza: kumpulan bernama Python ditulis (?P<name>…), PHP dan Python menyokong pengkuantiti possessive yang tiada dalam JavaScript, dan peraturan lookbehind berbeza-beza. Uji semula dalam enjin sasaran.
Bagaimanakah cara memadankan titik atau kurungan secara literal?
Escape dengan garis condong terbalik: \. sepadan dengan titik dan \[ dengan kurungan siku pembuka. Dalam kelas aksara kebanyakan simbol sudah literal, jadi [.] juga hanya sepadan dengan titik.
Mengapakah halaman menjadi beku semasa saya menaip corak?
Corak itu mungkin mencetuskan catastrophic backtracking pada teks anda. Muat semula, kemudian elakkan pengkuantiti bersarang seperti (.*)* atau (a+)+ dan pastikan setiap bahagian memadankan seminimum yang boleh.