Testi regulaaravaldist

testib regulaaravaldist (regex) tekstil ja kuvab vasted ja püütud rühmad

Milleks regulaaravaldiste testijat kasutatakse?

Regulaaravaldise tester võimaldab teil kontrollida regulaaravaldise mustri (regex) vastavust oodatud tekstile, ilma et peaksite rakenduse koodi käivitama. Kleebime mustri, kleepime sisendteksti, me kontrollige valikuid (lipud) ja tööriist kuvab kohe leitud vastete loendi samuti tabatud rühmad. See on PHP-s preg_match_all() võrgus vaste JavaScriptis String.matchAll() või Pythonis re.findall().

Regeksid on nii võimsad kui ka keerulised. Koma, valesti paigutatud sulud, kvantor ahn, kes imeb liiga palju märke: ja väljavõetud string pole enam see, mida ootasime. Tester väldib edasi-tagasi reisi redaktori, terminali ja testfailiga: me kordame mustrit, kuni näeme hea tulemus.

Kuidas mustrit kirjutada?

Sisestage regex ilma eraldajateta. Pole /.../ ega #...#. Näiteks e-posti aadresside jäädvustamiseks tekstist lihtsalt sisestage [\w.+-]+@[\w-]+\.[\w.-]+. Valikud (lipud) juhitakse märkeruutudega.

Valik u (Unicode) on vaikimisi märgitud. Seda soovitakse peaaegu alati: ilma selleta \w ei tuvasta rõhumärke ja mõned mustrid tagastavad vaikse PCRE vea UTF-8 stringid.

PCRE valikud

  • i (tõstutundlik): [a-z] tunneb ära ka suurtähed.
  • m (mitmerealine): ^ ja $ vastavad rea algusesse ja lõppu iga rida, pluss ainult üldise stringi algus ja lõpp.
  • s (dotall): . tuvastab ka reavahetused. Kasulik mustrite jaoks mis peavad läbima lõigud.
  • u (unicode): tõlgendab UTF-8 mustrit ja teemat. Oluline kohe kui tekst sisaldab mitte-ASCII märke (rõhumärgid, emotikonid, ideogrammid).

Levinud regexi näited

  • E-posti aadress: [\w.+-]+@[\w-]+\.[\w.-]+ (lihtsustatud vorm, piisav enamik praktilisi juhtumeid; range RFC 5322 on väga keeruline).
  • HTTP/HTTPS URL: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Prantsuse telefoninumber: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Prantsuse sihtnumber: \d{5}
  • ISO kuupäev (AAAA-KK-PP): \d{4}-\d{2}-\d{2}
  • IPv4-aadress: (?:\d{1,3}\.){3}\d{1,3}
  • Terve sõna: foo (sõnapiirid väldivad sobitamist jalgpall).
  • Räsimärk: #\w+
  • Semantiline versiooninumber: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitteri ID / X: @\w{1,15}

Püütud rühmad

Regex võib sisaldada sulgudes rühmi, mis eraldavad osa vastest korduskasutamiseks. Näiteks muster (\w+)@(\w+\.\w+), mis on rakendatud aadressile alice@example.com, hõivab kaks rühmad: alice ja example.com. Tööriist kuvab need rühmad veerus pühendatud, iga matši kõrval. Nimega rühmad ((?P...)) on samuti olemas loetletud, nime järgi indekseeritud.

Rühmitamiseks ilma hõivamiseta (kasulik kvantori rakendamiseks ilma rühmade loendit saastamata) kasutab (?:...).

Kaitse ReDoS-i eest

PHP PCRE-mootor võib teatud patoloogilistel põhjustel põhjustada katastroofilist tagasilööki. muster nagu (a+)+$, mida rakendatakse pikale lõpetamata stringile a, võib blokeerida serverisse mõneks sekundiks. Selle vältimiseks regulaaravaldise teenuse keelamine (ReDoS), rakendab tööriist kahte piirangut:

  • töötaja poolel set_time_limit(2) (töötlemine katkeb 2 sekundi pärast);
  • pcre.backtrack_limit vähendamine 100 000-ni, mis põhjustab mustrite kiiret ebaõnnestumist kes uurivad liiga palju kombinatsioone.

Liiga kalli põhjuse korral kuvab tööriist PCRE veateate (preg_last_error_msg()), tavaliselt Tagasiraja limiit on ammendatud. Sõnastage oma muster, kasutades omastavaid kvantoreid (a++) või aatomirühmi ((?>...)), et vältida tagasiliikumist.

Korduma kippuvad küsimused

Miks minu regex ei ühti, kuigi see töötab JavaScriptis?

Selle tööriista mootor on Perlile lähedane PCRE (PHP). Süntaks on väga sarnane JavaScriptile, kuid mõned funktsioonid erinevad: muutuva pikkusega tagavaatenurk, teatud varjunimed Unicode ehk tõstutundlikkuse vaiketöötlus. Kui plaanite käivitada mustri pool brauserit, testige ka JS-keskkonnas.

Miks mu \w ei võta rõhumärke?

Ilma lipu uta tuvastab \w ainult [A-Za-z0-9_]. Koos u (Unicode) tunneb ära kõik tähed UCD tähenduses, sealhulgas rõhumärgid. Edasiliikumiseks kasutage Unicode'i klasse: \p{L} (täht), \p{N} (number), \p{P} (kirjavahemärgid).

Kas tööriist säilitab minu teksti?

Ei. PHP töötaja töötleb mustrit ja teemat RAM-is ilma püsivuseta. Andmed puuduvad esitatud ei logita.

Mida peaksin tegema, kui saan teate "Tagasiraja limiit on ammendatud"?

Teie muster liigub liiga palju edasi-tagasi. Otsige seda tüüpi pesastatud kvantoreid (a+)+ või (\w+)*, mis on tüüpilised ReDoS-i juhtumid. Asendage need ühega üheselt mõistetav vorm: näiteks \w+ asemel (\w+)*.

Kas ma saan testida mitmerealist mustrit?

Jah. Märkige suvand m, et ^ ja $ tunneksid ära alguse ja iga rea otsad. Täiendavalt märkige s, kui soovite ., et ületada reavahed.

Päringunäide

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

Sisendskeem

Väli Tüüp Kohustuslik Vaikimisi
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Lõpp-punktid

  • GET https://cdrn.fr/api/v1/tools - loetleb kõik saadaolevad tööriistad
  • GET https://cdrn.fr/api/v1/tools/regex-tester - toob selle tööriista skeemi
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - täidab selle tööriista JSON-payloadiga