Salt la conținut

Tester regex

Testați expresii regulate JavaScript cu potriviri evidențiate, grupuri de captură, o explicație în limbaj simplu, cod gata de folosit și o verificare de backtracking catastrofal.

Rulează în browser. Nimic nu este încărcat.

Sintaxă JavaScript, fără barele oblice de delimitare.
g i m s u y d v
Fișă de referință
Sintaxă regex JavaScript
Caractere
.Orice caracter în afară de un sfârșit de rând; cu flagul s, și sfârșiturile de rând
\d \DO cifră 0-9; \D este orice nu este o cifră
\w \WO literă, o cifră sau underscore; \W este orice altceva
\s \SUn spațiu, un tab sau un sfârșit de rând; \S este orice nu este spațiu alb
[abc]Oricare dintre caracterele listate
[^abc]Orice caracter care nu este listat
[a-z]Orice caracter din interval
\. \+Un backslash transformă un caracter special în caracter literal
Câte
*Zero sau mai multe
+Unul sau mai multe
?Zero sau unu: partea dinaintea sa este opțională
{2} {2,} {2,5}Exact 2, cel puțin 2, între 2 și 5
+? *?Un ? după un cuantificator îl face leneș: cât mai puține caractere posibil
Grupuri și alternative
(…)Grup de captură, citit înapoi ca $1, $2 …
(?:…)Grupează fără captură
(?<name>…)Grup denumit, citit înapoi ca $<name>
a|bOricare dintre cele două părți ale barei verticale
\1Ceea ce a potrivit primul grup, din nou
(?=…) (?!…)Urmat de / neurmat de, fără a-l consuma
(?<=…) (?<!…)Precedat de / neprecedat de, fără a-l consuma
Poziții
^Începutul textului; cu flagul m, începutul unei linii
$Sfârșitul textului; cu flagul m, sfârșitul unei linii
\b \BO limită de cuvânt; \B este orice loc care nu este una
Flaguri
gGăsește fiecare potrivire, nu doar prima
iIgnoră majusculele și minusculele
m^ și $ se potrivesc și la fiecare sfârșit de rând
sPunctul se potrivește și cu întreruperile de linie
u vMod Unicode, necesar pentru \p{…}; v este forma extinsă
ySticky: potrivește doar acolo unde s-a terminat ultima potrivire
dRaportează începutul și sfârșitul fiecărui grup, afișate în tabelul de potriviri

Despre acest instrument

Testerul regex rulează o expresie regulată JavaScript pe textul dumneavoastră de probă pe măsură ce tastați: potrivirile sunt evidențiate pe loc, iar un tabel listează fiecare potrivire cu indexul și cu grupurile sale de captură, inclusiv cele numite. Activați Înlocuiește pentru a vedea rezultatul lui String.replace cu $1, $<name> sau $& în textul de înlocuire. Explicație vă citește tiparul înapoi, parte cu parte - „o cifră 0-9, exact de 4 ori”, „un grup de captură numit year”, „o limită de cuvânt” - și spune deschis acest lucru pentru orice construcție pe care nu o recunoaște, în loc să o descrie dintr-o presupunere. Folosiți acest tipar în cod transformă același tipar și aceiași indicatori într-un fragment JavaScript, Python, PHP sau Go, cu scrierea indicatorilor specifică fiecărui limbaj și cu o notă pentru fiecare indicator care nu are corespondent în limbajul respectiv. Verificarea de backtracking citește aceeași analiză în căutarea formelor care produc backtracking catastrofal - un cuantificator imbricat într-un cuantificator peste caractere pe care le au în comun, alternative care pot potrivi același text sub un cuantificator și o repetiție nemărginită urmată de ceva care poate potrivi aceleași caractere - și numește subșirul, motivul pentru care face backtracking și o rescriere; nu rulează niciodată tiparul pe o intrare construită ca să fie lentă, așa că vă poate spune că a găsit o formă, dar niciodată că nu există niciuna. Este motorul JavaScript, deci sintaxa disponibilă doar în PCRE, precum recursivitatea, grupurile atomice sau cuantificatorii posesivi, nu este disponibilă, iar instrumentul testează tipare, nu validează formate de date în locul dumneavoastră.

Modelul, flagurile, textul de test și textul de înlocuire nu părăsesc niciodată browserul dumneavoastră: sunt evaluate într-un Web Worker, nu sunt trimise către API-ul XGM și nu sunt scrise în URL, așa că un link pe care îl distribuiți conține instrumentul și nimic din ce ați tastat. Workerul este oprit după 1,5 secunde, motiv pentru care un model cu backtracking catastrofal oprește execuția în loc să blocheze pagina. Explicația, fragmentele de cod și verificarea de backtracking sunt construite tot din textul modelului aflat în pagină: toate trei parsează modelul în loc să îl ruleze și fiecare spune acest lucru pentru orice nu recunoaște, în loc să descrie pe baza unei presupuneri. Verificarea de backtracking, în particular, nu încearcă niciodată modelul pe date construite ca să fie lente - caută formele care produc backtracking - deci vă poate spune doar că a găsit una, niciodată că nu există niciuna.

Cum se folosește

  1. Deschideți instrumentul Tester regex.
  2. Lipiți sau tastați datele pe care vreți să le inspectați.
  3. Citiți rezultatul, calculat în browser; datele nu sunt trimise către XGM.
  4. Copiați rezultatul doar după ce ați verificat că arată corect.
  5. Folosiți instrumentele XGM înrudite dacă aveți nevoie de o imagine de diagnostic mai largă.

Întrebări frecvente

Ce flaguri pot folosi?

g, i, m, s, u, y, d și v - flagurile RegExp-ului propriu al browserului. Fără g se returnează doar prima potrivire; s permite punctului să se potrivească cu liniile noi; d adaugă indexul de început și de sfârșit al fiecărui grup de captură.

De ce s-a oprit testerul după 1,5 secunde și îmi verifică tiparul pentru ReDoS?

Modelul a intrat în backtracking catastrofal, de obicei cuantificatori imbricați precum (a+)+ sau (\w+\s?)* pe un text care aproape se potrivește. Modelul rulează într-un Web Worker care este oprit la 1,5 secunde, așa că pagina rămâne receptivă - un server care rulează același model pe intrarea utilizatorului nu are o astfel de protecție. Verificarea de backtracking citește doar forma modelului, fără să îl ruleze pe o intrare construită ca să fie lentă, și raportează trei structuri cu subșirul exact: un cuantificator imbricat în altul peste caractere pe care le au în comun, un grup cuantificat ale cărui alternative pot potrivi același text și o repetiție nelimitată urmată de ceva ce poate potrivi aceleași caractere. Fiecare spune de ce face backtracking și cum se rescrie. O construcție pe care nu o poate analiza este raportată ca „neanalizată”, nu ca sigură, iar un rezultat curat nu este o dovadă.

Modelul sau textul meu de test părăsesc browserul?

Nu. Totul rulează într-un Web Worker în browserul dumneavoastră, nimic nu este trimis către serverul XGM, iar URL-ul păstrează doar instrumentul, niciodată modelul sau textul dumneavoastră.

De ce văd doar primele 200 de potriviri?

Evidențierea se oprește la 300 de potriviri, iar tabelul la 200, pentru ca randarea să rămână rapidă pe intrări mari. Contorul de deasupra lor arată totalul real, cu un + atunci când a fost limitat, iar exportul JSON conține rezultatul complet.

De ce modelul meu se comportă diferit în Python sau PHP?

Escape-urile și clasele diferă de la un motor la altul: \d ține cont de Unicode în Python 3, dar este doar ASCII în JavaScript fără flagul u, lookbehind nu este disponibil peste tot, iar grupurile denumite se scriu (?P<name>) în Python față de (?<name>) aici. Testați cu motorul care va rula modelul în producție.

Cât de exactă este explicația în limbaj simplu?

Analizează tiparul în sine - nu îl execută niciodată - și descrie ancorele, secvențele escape, clasele de caractere cu intervalele lor, grupurile (de captură, denumite, fără captură și toate cele patru forme de lookaround), referințele inverse, alternanța și fiecare cuantificator, inclusiv cele leneșe, cu indicatorii m și s integrați în ceea ce se spune că înseamnă ^, $ și punctul. Orice iese din această listă, cum ar fi un grup de modificatori inline precum (?i:…) sau operațiile pe mulțimi permise de indicatorul v între paranteze drepte, este afișat exact așa cum l-ați scris și etichetat „Neexplicat”, pentru că o explicație greșită este mai rea decât niciuna.

Fragmentele de cod generate rulează așa cum sunt?

Sunt scheletul de compilare-și-potrivire pentru fiecare limbaj, aplicat pe o variabilă text pe care o furnizați. Indicatorii sunt traduși, nu copiați: Python primește re.IGNORECASE, re.MULTILINE și re.DOTALL, PHP primește i, m, s și u după delimitator, iar Go îi primește în interiorul tiparului, ca (?ims). g nu are o literă în afara JavaScript, așa că fragmentul folosește în schimb finditer, preg_match_all sau FindAllStringSubmatch, iar y, d și v nu au corespondent nicăieri și sunt menționate într-o notă, în loc să fie eliminate în tăcere. Mai apar două note, atunci când se aplică: Python scrie un grup denumit ca (?P<name>…), iar motorul RE2 din Go respinge direct lookaround-ul și referințele înapoi.

Citiți ghidul complet Tester regex