Testēt regulāro izteiksmi

testē regulāro izteiksmi (regex) uz teksta un parāda atbilstības un uztvertās grupas

Kam tiek izmantots regulārās izteiksmes pārbaudītājs?

Izmantojot regulāro izteiksmju testeri, varat pārbaudīt, vai regulārās izteiksmes modelis (regulārā izteiksme) atbilst uz paredzēto tekstu, nepalaižot lietojumprogrammas kodu. Mēs ielīmējam modeli, mēs ielīmējam ievades tekstu, mēs pārbaudiet opcijas (karodziņus), un rīks nekavējoties parāda atrasto atbilstību sarakstu kā arī notvertās grupas. Šis ir tiešsaistes ekvivalents vārdam preg_match_all() PHP, no String.matchAll() programmā JavaScript vai re.findall() programmā Python.

Regexes ir gan spēcīgas, gan sarežģītas. Komats, nevietā ievietotas iekavas, kvantētājs rijējs, kurš iesūc pārāk daudz rakstzīmju: un izvilktā virkne vairs nav tāda, kādu mēs gaidījām. Testeris izvairās no ceļojuma turp un atpakaļ, izmantojot redaktoru, termināli un testa failu: mēs atkārtojam modeli, līdz redzam labs rezultāts.

Kā uzrakstīt modeli?

Ievadiet regulāro izteiksmi bez atdalītājiem. Nav /.../, nav #...#. Piemēram, lai tvertu e-pasta adreses no teksta, vienkārši ievadiet [\w.+-]+@[\w-]+\.[\w.-]+. Opcijas (karodziņus) kontrolē izvēles rūtiņas.

Opcija u (Unicode) ir atzīmēta pēc noklusējuma. Tas ir gandrīz vienmēr vēlams: bez tā, \w neatpazīst akcentus, un daži modeļi atgriež kluso PCRE kļūdu UTF-8 virknes.

PCRE iespējas

  • i (reģistrjutīgs): [a-z] atpazīst arī lielos burtus.
  • m (daudzrindu): ^ un $ atbilst sākumiem un beigām katra rindiņa, kā arī tikai kopējās virknes sākums un beigas.
  • s (dotall): . atpazīst arī rindiņu pārtraukumus. Noderīgi modeļiem kam jāšķērso rindkopas.
  • u (unikods): interpretē modeli un priekšmetu UTF-8. Būtiski, tiklīdz teksts satur rakstzīmes, kas nav ASCII rakstzīmes (akcenti, emocijzīmes, ideogrammas).

Izplatīti regex piemēri

  • E-pasta adrese: [\w.+-]+@[\w-]+\.[\w.-]+ (vienkāršota forma, pietiekama vairums praktisko gadījumu; stingrais RFC 5322 ir ļoti sarežģīts).
  • HTTP/HTTPS URL: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Francijas tālruņa numurs: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Francijas pasta indekss: \d{5}
  • ISO datums (GGGG-MM-DD): \d{4}-\d{2}-\d{2}
  • IPv4 adrese: (?:\d{1,3}\.){3}\d{1,3}
  • Viss vārds: foo (vārdu robežas izvairās no atbilstības futbols).
  • Hashtag: #\w+
  • Semantiskās versijas numurs: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitter ID/X: @\w{1,15}

Noķertas grupas

Regulārajā izteiksmē iekavās var būt iekļautas grupas, kas izolē atbilstības daļu atkārtotai izmantošanai. Piemēram, modelis (\w+)@(\w+\.\w+), kas tiek lietots vietnei alice@example.com, tver divus grupas: alise un example.com. Rīks parāda šīs grupas kolonnā veltīts, blakus katram mačam. Ir arī nosauktas grupas ((?P...)). uzskaitīti, indeksēti pēc nosaukuma.

Lai grupētu bez tveršanas (noderīgi, lai lietotu kvantatoru, nepiesārņojot grupu sarakstu), mēs izmanto (?:...).

Aizsardzība pret ReDoS

PHP PCRE dzinējs var izraisīt katastrofālu atkāpšanos noteiktu patoloģisku iemeslu dēļ: paraugs, piemēram, (a+)+$, kas tiek lietots garai nepabeigtai virknei a, var bloķēt serverī vairākas sekundes. Lai izvairītos no šīs regulārās izteiksmes pakalpojuma atteikums (ReDoS), rīks piemēro divus ierobežojumus:

  • set_time_limit(2) darbinieka pusē (apstrāde tiek pārtraukta pēc 2 sekundēm);
  • samazinot pcre.backtrack_limit līdz 100 000, izraisot modeļu ātru neveiksmi kuri izpēta pārāk daudz kombināciju.

Pārāk dārga iemesla gadījumā rīks parāda PCRE kļūdas ziņojumu (preg_last_error_msg()), parasti Backtrack ierobežojums ir izsmelts. Pārfrāzējiet savu modelis, izmantojot īpašumtiesības kvantorus (a++) vai atomu grupas ((?>...)), lai izvairītos no atkāpšanās.

Bieži uzdotie jautājumi

Kāpēc mans regex neatbilst, lai gan tas darbojas JavaScript?

Šī rīka dzinējs ir PCRE (PHP), kas ir tuvu Perl. Sintakse ir ļoti līdzīga JavaScript, bet dažas funkcijas atšķiras: mainīga garuma izskats, noteikti aizstājvārdi Unicode jeb noklusējuma reģistrjutīguma apstrāde. Ja plānojat palaist raksta pusi pārlūkprogrammu, pārbaudiet arī JS vidē.

Kāpēc mans \w neuztver akcentus?

Bez karoga u \w atpazīst tikai [A-Za-z0-9_]. Ar u (Unicode), tas atpazīst visus burtus UCD nozīmē, ieskaitot diakritiskās rakstzīmes. Lai iet tālāk, izmantojiet Unicode klases: \p{L} (burts), \p{N} (skaitlis), \p{P} (pieturzīmes).

Vai rīks saglabā manu tekstu?

Nē. PHP darbinieks bez neatlaidības apstrādā modeli un tēmu RAM. Nav datu iesniegtais nav reģistrēts.

Kas man jādara, ja saņemu ziņojumu "Atkāpšanās ierobežojums ir izsmelts"?

Jūsu modelis pārāk daudz iet uz priekšu un atpakaļ. Meklējiet šāda veida ligzdotos kvantorus (a+)+ vai (\w+)*, kas ir tipiski ReDoS gadījumi. Nomainiet tos ar vienu nepārprotama forma: piemēram, \w+, nevis (\w+)*.

Vai varu pārbaudīt vairākrindu rakstu?

Jā. Atzīmējiet opciju m, lai ^ un $ atpazītu sākumu un katras rindas galiem. Papildus atzīmējiet s, ja vēlaties ., lai šķērsotu līniju pārtraukumi.

Pieprasījuma piemērs

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

Ievades shēma

Lauks Tips Obligāts Noklusējums
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Endpoint

  • GET https://cdrn.fr/api/v1/tools - uzskaita visus pieejamos rīkus
  • GET https://cdrn.fr/api/v1/tools/regex-tester - iegūst šī rīka shēmu
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - izpilda šo rīku ar JSON payload