Testuoti reguliariąją išraišką
- Skydelis
- Dokumentacija
- API
Kam naudojamas reguliariųjų reiškinių tikrintuvas?
Naudodami reguliariosios išraiškos testerį galite patikrinti, ar reguliariosios išraiškos šablonas (regex) atitinka
į laukiamą tekstą, nepaleidžiant programos kodo. Mes įklijuojame modelį, įklijuojame įvesties tekstą, mes
patikrinkite parinktis (vėliavos), o įrankis iš karto parodys rastų atitikčių sąrašą
taip pat sugautas grupes. Tai internetinis atitikmuo preg_match_all() PHP, iš
String.matchAll() JavaScript arba re.findall() Python.
Regexes yra ir galingos, ir sudėtingos. Kablelis, ne vietoje pateikti skliaustai, kiekybinis rodiklis slogus, kuris įsiurbia per daug simbolių: ir išgauta eilutė nebėra tokia, kokios tikėjomės. Testeris išvengia kelionės pirmyn ir atgal su redaktoriumi, terminalu ir bandomuoju failu: kartojame šabloną, kol pamatome geras rezultatas.
Kaip parašyti šabloną?
Įveskite reguliarųjį reiškinį be skiriamųjų ženklų. Nėra /.../, nėra #...#.
Pavyzdžiui, norėdami užfiksuoti el. pašto adresus iš teksto, tiesiog įveskite
[\w.+-]+@[\w-]+\.[\w.-]+. Parinktys (vėliavos) valdomos žymimaisiais laukeliais.
Parinktis u (Unikodas) yra pažymėta pagal numatytuosius nustatymus. Beveik visada norima: be jo,
\w neatpažįsta diakritinių ženklų, o kai kurie šablonai grąžina tyliąją PCRE klaidą
UTF-8 eilutės.
PCRE parinktys
- i (neskiriamos didžiosios ir mažosios raidės):
[a-z]taip pat atpažįsta didžiąsias raides. - m (kelių eilučių):
^ir$atitinka pradžią ir pabaigą kiekviena eilutė ir tik visos eilutės pradžia ir pabaiga. - s (taškas):
.taip pat atpažįsta eilučių lūžius. Naudinga modeliams kurios turi kirsti pastraipas. - u (unikodas): interpretuoja UTF-8 šabloną ir temą. Esminis, kai tik tekstas yra ne ASCII simbolių (kirčiučių, jaustukų, ideogramų).
Įprasti Regex pavyzdžiai
- El. pašto adresas:
[\w.+-]+@[\w-]+\.[\w.-]+(supaprastinta forma, užtenka dauguma praktinių atvejų; griežtas RFC 5322 yra labai sudėtingas). - HTTP / HTTPS URL:
https?://[\w.-]+(?:/[\w./?%&=-]*)? - Prancūziškas telefono numeris:
(?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4} - Prancūzijos pašto kodas:
\d{5} - ISO data (MMMM-MM-DD):
\d{4}-\d{2}-\d{2} - IPv4 adresas:
(?:\d{1,3}\.){3}\d{1,3} - Visas žodis:
foo(žodžių ribos vengia atitiktiesfutbolas). - Žyma su grotelėmis:
#\w+ - Semantinės versijos numeris:
\d+\.\d+\.\d+(?:-[\w.-]+)? - Twitter ID / X:
@\w{1,15}
Užfiksuotos grupės
Reguliariajame reiškinyje skliausteliuose gali būti grupių, kurios išskiria atitikties dalį pakartotiniam naudojimui.
Pavyzdžiui, šablonas (\w+)@(\w+\.\w+), taikomas alice@example.com, užfiksuoja du
grupės: alisa ir example.com. Įrankis šias grupes rodo stulpelyje
skirta, prie kiekvienos rungtynes. Taip pat yra pavadintos grupės ((?P).
išvardyti, indeksuoti pagal pavadinimą.
Norėdami sugrupuoti be fiksavimo (naudinga taikant kvantorių neteršiant grupių sąrašo), mes
naudoja (?:...).
Apsauga nuo ReDoS
PHP PCRE variklis gali pradėti katastrofišką grįžimą dėl tam tikrų patologinių priežasčių:
šablonas, pvz., (a+)+$, taikomas ilgai nebaigtai a eilutei, gali blokuoti
serveryje kelias sekundes. Kad išvengtumėte šios įprastos išraiškos atsisakymas teikti paslaugą
(ReDoS), įrankis taiko du apribojimus:
set_time_limit(2)darbuotojo pusėje (apdorojimas nutrūksta po 2 sekundžių);- sumažinus
pcre.backtrack_limitiki 100 000, todėl šablonai greitai sugenda kurie tyrinėja per daug kombinacijų.
Per brangios priežasties atveju įrankis parodo PCRE klaidos pranešimą
(preg_last_error_msg()), paprastai Backtrack limitas buvo išnaudotas. Perfrazuokite savo
modelis naudojant turimus kvantorius (a++) arba atomines grupes
((?>...)), kad būtų išvengta atsitraukimo.
Dažnai užduodami klausimai
Kodėl mano reguliarioji išraiška neatitinka, nors ji veikia JavaScript?
Šio įrankio variklis yra PCRE (PHP), artimas Perl. Sintaksė labai panaši į „JavaScript“, bet kai kurios funkcijos skiriasi: kintamo ilgio pažiūros užpakalyje, tam tikri slapyvardžiai Unikodas arba numatytasis didžiųjų ir mažųjų raidžių jautrumo tvarkymas. Jei planuojate paleisti modelio pusę naršyklę, taip pat testuokite JS aplinkoje.
Kodėl mano \w nefiksuoja kirčių?
Be vėliavėlės u, \w atpažįsta tik [A-Za-z0-9_]. Su
u (Unikodas), jis atpažįsta visas raides UCD prasme, įskaitant kirčiuotus simbolius.
Norėdami eiti toliau, naudokite Unicode klases: \p{L} (raidė), \p{N}
(skaičius), \p{P} (skyrybos ženklai).
Ar įrankis išsaugo mano tekstą?
Ne. Šabloną ir temą RAM apdoroja PHP darbuotojas be atkaklumo. Nėra duomenų pateikta neregistruojama.
Ką turėčiau daryti, jei gaunu pranešimą "Backtrack limitas was ended"?
Jūsų modelis per daug juda pirmyn ir atgal. Ieškokite tokio tipo įdėtųjų kvantorių
(a+)+ arba (\w+)*, kurie yra tipiški ReDoS atvejai. Pakeiskite juos vienu
nedviprasmiška forma: pavyzdžiui, \w+ vietoj (\w+)*.
Ar galiu išbandyti kelių eilučių šabloną?
Taip. Pažymėkite parinktį m, kad ^ ir $ atpažintų pradžią
ir kiekvienos eilutės galai. Papildomai pažymėkite s, jei norite ., kad perbrauktų
eilučių pertraukos.
Užklausos pavyzdys
curl -X POST https://cdrn.fr/api/v1/tools/regex-tester/execute \
-H "Content-Type: application/json" \
-d '{"pattern":"...","subject":"...","flag_i":false,"flag_m":false,"flag_s":false,"flag_u":true}'
Įvesties schema
| Laukas | Tipas | Privalomas | Numatytasis |
|---|---|---|---|
pattern |
string | ✓ | – |
subject |
text | ✓ | – |
flag_i |
boolean | ✓ | false |
flag_m |
boolean | ✓ | false |
flag_s |
boolean | ✓ | false |
flag_u |
boolean | ✓ | true |
Galiniai taškai
GET https://cdrn.fr/api/v1/tools- išvardija visus galimus įrankiusGET https://cdrn.fr/api/v1/tools/regex-tester- gauna šio įrankio schemąPOST https://cdrn.fr/api/v1/tools/regex-tester/execute- vykdo šį įrankį su JSON payload