Testirati regularni izraz

testira regularni izraz (regex) na besedilu in prikazuje ujemanja in zajete skupine

Za kaj se uporablja tester regularnih izrazov?

Preizkuševalec regularnih izrazov vam omogoča, da preverite, ali se vzorec regularnega izraza (regex) ujema na pričakovano besedilo, ne da bi morali zagnati kodo aplikacije. Prilepimo vzorec, prilepimo vneseno besedilo, mi preverite možnosti (zastavice) in orodje takoj prikaže seznam najdenih ujemanj kot tudi ujete skupine. To je spletni ekvivalent preg_match_all() v PHP, od String.matchAll() v JavaScriptu ali re.findall() v Pythonu.

Redni izrazi so močni in zapleteni. Vejica, napačno postavljen oklepaj, kvantifikator požrešnik, ki posrka preveč znakov: in izluščeni niz ni več to, kar smo pričakovali. Tester se izogne povratnemu potovanju z urejevalnikom, terminalom in testno datoteko: vzorec ponavljamo, dokler ne vidimo dober rezultat.

Kako napisati vzorec?

Vnesite regularni izraz brez ločil. Brez /.../, brez #...#. Na primer, če želite zajeti e-poštne naslove iz besedila, preprosto vnesite [\w.+-]+@[\w-]+\.[\w.-]+. Možnosti (zastavice) nadzirate s potrditvenimi polji.

Možnost u (Unicode) je privzeto označena. Je skoraj vedno zaželeno: brez njega, \w ne prepozna naglasov in nekateri vzorci vrnejo tiho napako PCRE na Nizi UTF-8.

PCRE možnosti

  • i (neobčutljivo za velike črke): [a–z] prepozna tudi velike črke.
  • m (večvrstično): ^ in $ se ujemata z začetkom in koncem vsaka vrstica ter samo začetek in konec celotnega niza.
  • s (dotall): . prepozna tudi prelome vrstic. Uporabno za vzorce ki mora prečkati odstavke.
  • u (unicode): interpretira vzorec in predmet v UTF-8. Bistveno takoj, ko besedilo vsebuje znake, ki niso ASCII (naglasi, emoji, ideogrami).

Pogosti primeri regularnih izrazov

  • E-poštni naslov: [\w.+-]+@[\w-]+\.[\w.-]+ (poenostavljena oblika, zadostuje za najbolj praktični primeri; strogi RFC 5322 je zelo zapleten).
  • URL HTTP/HTTPS: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Francoska telefonska številka: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Francoska poštna številka: \d{5}
  • Datum ISO (LLLL-MM-DD): \d{4}-\d{2}-\d{2}
  • Naslov IPv4: (?:\d{1,3}\.){3}\d{1,3}
  • Celotna beseda: foo (meje besed se izogibajo ujemanju nogomet).
  • Hashtag: #\w+
  • Semantična številka različice: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitter ID / X: @\w{1,15}

Zajete skupine

Regularni izraz lahko vsebuje skupine v oklepajih, ki izolirajo del ujemanja za ponovno uporabo. Na primer, vzorec (\w+)@(\w+\.\w+), uporabljen za alice@example.com, zajema dva skupine: alice in example.com. Orodje te skupine prikaže v stolpcu namensko, ob vsaki tekmi. Poimenovane skupine ((?P...)) so tudi naveden, indeksiran po imenu.

Za združevanje brez zajema (uporabno za uporabo kvantifikatorja brez onesnaženja seznama skupin) uporablja (?:...).

Zaščita pred ReDoS

PHP-jev motor PCRE lahko vstopi v katastrofalno povratno sledenje zaradi določenih patoloških razlogov: vzorec, kot je (a+)+$, uporabljen za dolg neprekinjen niz a, lahko blokira strežnik za nekaj sekund. Da bi se izognili tej zavrnitvi storitve regularnega izraza (ReDoS), orodje uporablja dve omejitvi:

  • a set_time_limit(2) na delavski strani (obdelava se prekine po 2 sekundah);
  • zmanjšanje pcre.backtrack_limit na 100.000, zaradi česar vzorci hitro odpovejo ki raziskujejo preveč kombinacij.

V primeru predragega razloga orodje prikaže sporočilo o napaki PCRE (preg_last_error_msg()), običajno omejitev povratnega sledenja je bila izčrpana. Preoblikujte svoje vzorec z uporabo posesivnih kvantifikatorjev (a++) ali atomskih skupin ((?>...)), da se izognete vračanju nazaj.

Pogosta vprašanja

Zakaj se moj regularni izraz ne ujema, čeprav deluje v JavaScriptu?

Motor tega orodja je PCRE (PHP), blizu Perlu. Sintaksa je zelo podobna JavaScriptu, vendar nekatere funkcije se razlikujejo: lookbehinds spremenljive dolžine, določeni vzdevki Unicode ali privzeto ravnanje z razlikovanjem med velikimi in malimi črkami. Če nameravate zagnati stran vzorca brskalnik, preizkusite tudi v okolju JS.

Zakaj moj \w ne zajame naglasov?

Brez zastavice u \w prepozna samo [A-Za-z0-9_]. z u (Unicode), prepozna vse črke v smislu UCD, vključno z naglašenimi znaki. Če želite iti dlje, uporabite razrede Unicode: \p{L} (črka), \p{N} (številka), \p{P} (ločila).

Ali orodje ohrani moje besedilo?

Ne. Vzorec in zadevo v RAM-u obdela PHP delavec brez vztrajnosti. Ni podatkov poslano ni zabeleženo.

Kaj naj storim, če prejmem sporočilo »Omejitev povratnega sledenja je bila izčrpana«?

Vaš vzorec gre preveč naprej in nazaj. Poiščite ugnezdene kvantifikatorje vrste (a+)+ ali (\w+)*, kar sta tipična primera ReDoS. Zamenjajte jih z enim nedvoumna oblika: na primer \w+ namesto (\w+)*.

Ali lahko preizkusim večvrstični vzorec?

ja Preverite možnost m, da ^ in $ prepoznata začetke in konca vsake vrstice. Dodatno označite s, če želite, da . prečka prelomi vrstic.

Primer zahteve

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}'

Vhodna shema

Polje Tip Obvezno Privzeto
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Končne točke

  • GET https://cdrn.fr/api/v1/tools - izpiše vsa razpoložljiva orodja
  • GET https://cdrn.fr/api/v1/tools/regex-tester - pridobi shemo tega orodja
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - izvede to orodje s JSON payloadom