Testuoti reguliariąją išraišką

testuoja reguliariąją išraišką (regex) tekste ir parodo atitikmenis ir užfiksuotas grupes

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 atitikties futbolas).
  • Ž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_limit iki 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 įrankius
  • GET 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