Reguliariųjų išraiškų testeris
Testuokite ir derinkite JavaScript reguliariuosius reiškinius su tiesioginiu paryškinimu, grupėmis ir žingsnis po žingsnio paaiškinimu.
Regex testeris
Atnaujinama, kol rašote(…), kad ją užgriebtumėte, arba naudokite (?<name>…) įvardintai grupei.Kaip veikia reguliarieji reiškiniai
Reguliarusis reiškinys yra maža šablonų kalba tekstui aprašyti. Ši priemonė naudoja JavaScript variklį (įtaisytą į Jūsų naršyklę), todėl kiekvienas čia įvestas šablonas elgiasi lygiai taip pat kaip new RegExp(…) .js faile.
- Kompiliavimas. Variklis suanalizuoja Jūsų šabloną į vidinį būsenų automatą. Čia išlenda sintaksės klaidos — tai „Netinkamas regex“ laukas.
- Skenavimas. Variklis eina per testuojamą tekstą iš kairės į dešinę, kiekvienoje pozicijoje bandydamas šabloną.
- Atitikmuo arba grįžimas atgal. Kai žetonas nepavyksta, variklis grįžta atgal ir bando kitą šaką (alternatyvas
|, godžius vs. tingius kvantifikatorius, neprivalomas grupes). - Rinkimas. Su
gvėliava tęsia po kiekvieno atitikmens; begsustoja ties pirmu radimu.
JavaScript vs. PCRE (PHP / Python)
Jei rašėte regex kitose kalbose, keli dalykai skiriasi:
- Vėliavų raidės panašios:
g i m s u. JS taip pat turiy(sticky) ird(hasIndices). PCRE pridedax(išplėstinį), kurio JavaScript nepalaiko. - Apžvalgos atgal
(?<=…)ir(?<!…)veikia šiuolaikiniuose JS varikliuose, bet senesniuose tik fiksuoto pločio. - Savininkai kvantifikatoriai
a++,a*+ir atominės grupės(?>…)JavaScript neegzistuoja. - Rekursija
(?R)ir paprogramės iškvietimai(?1)— tik PCRE. - Unicode savybių ekranavimams
\p{Letter}JS reikiauvėliavos.
Dažniausios klaidos
- Pagal numatymą — godus.
.*griebia kuo daugiau. Kad atitiktų trumpiausią dalį, naudokite tingų.*?. - Katastrofinis grįžimas atgal. Įdėti kvantifikatoriai kaip
(a+)+$gali užšaldyti naršyklę esant patologiniam įvedimui. Rinkitės greitai nepavykstančius šablonus — pvz.,\w+@\w+vietoj(\w+)+@\w+. - Inkarams reikia tinkamos vėliavos.
^ir$pagal numatymą atitinka visos eilutės pradžią/pabaigą. Pridėkitemvėliavą, kad atitiktų kiekvieną eilutę. - Taškas sustoja ties nauja eilute. Naudokite
svėliavą, kai reikia, kad.peržengtų eilučių lūžius. - Simbolių klasėse ekranuokite atsargiai.
[…]viduje metasimboliai yra tik] \ ^ -. Visa kita — literalas;.ar*ekranuoti nereikia. - Global + exec() realiame kode:
RegExp.lastIndexturi būseną. Jei iteruojate atitikmenis JS, naudokiteString.matchAll()arba nustatykitelastIndexiš naujo.
Spręsti pavyzdžiai
/(\w+)@(\w+\.\w+)/gAtitinka žodžio simbolių bloką, @, tada žodis.taškas.žodis. Dvi grupės leidžia išgauti lokalią dalį ir domeną. Realūs el. paštai sudėtingesni — RFC 5322 gramatika gerokai klaikesnė — bet šito pakanka žurnalų nagrinėjimui ir formos patarimams.
/\b(\d{4})-(\d{2})-(\d{2})\b/gTrys fiksuoto pločio skaitmenų grupės, atskirtos brūkšneliais, įsprausto tarp žodžių ribų, kad neatitiktų viduryje eilutės. Griežtam validavimui dar apribotumėte mėnesius 0[1-9]|1[0-2].
/\b(?:\d{1,3}\.){3}\d{1,3}\b/gNegriebianti grupė (?:…) kartojama tris kartus plius galutinis oktetas. Tai atitinka tik formą — 999.999.999.999 praeina. Griežtam validavimui kiekvienas oktetas tampa 25[0-5]|2[0-4]\d|[01]?\d\d?.
/(\d{4})-(\d{2})-(\d{2})/ → $3/$2/$1Keitimo skirtuke tai paverčia kiekvieną 2024-07-04 į 04/07/2024. $1, $2, $3 yra atgalinės nuorodos į grupes.
/<[^>]+>/g[^>]+ reiškia „vienas ar daugiau simbolių, kurie nėra >“. Greičiau ir saugiau už godų .*, nes simbolių klasė negali grįžti atgal per žymos ribas. Vis tiek ne tikras HTML analizatorius — rimtam darbui naudokite DOM analizatorių.
Kada nenaudoti regex
- HTML, XML, JSON. Naudokite analizatorių. Regex negali subalansuoti įdėtų struktūrų.
- El. pašto RFC atitikimas. Pilna gramatika — ~6 KB. Naudokite specializuotą biblioteką arba paprastą „yra @ ir taškas po jo“ patikrą plius patvirtinimo laišką.
- Datos su kalendoriaus taisyklėmis. Regex gali atitikti formą, bet ne keliamuosius metus.
- Natūralios kalbos analizė. Beveik visada ne tas įrankis — griebkite tokenizatorių arba LLM.