Reguláris kifejezés tesztelése

reguláris kifejezést (regex) tesztel szövegen és megjeleníti a találatokat és elfogott csoportokat

Mire használható a reguláris kifejezés tesztelő?

A regex teszter lehetővé teszi annak ellenőrzését, hogy egy reguláris kifejezés-minta (regex) egyezik-e a várt szövegre, anélkül, hogy elindítaná az alkalmazás kódját. Beillesztjük a mintát, beillesztjük a beviteli szöveget, mi ellenőrizze a beállításokat (jelzők), és az eszköz azonnal megjeleníti a talált egyezések listáját valamint az elfogott csoportokat. Ez a preg_match_all() online megfelelője PHP-ben, innen String.matchAll() JavaScriptben vagy re.findall() Pythonban.

A regexek egyszerre erősek és trükkösek. Egy vessző, egy rosszul elhelyezett zárójel, egy kvantor falánk, aki túl sok karaktert szív be: és a kivont karakterlánc már nem az, amit vártunk. A tesztelő elkerüli az oda-vissza utat szerkesztővel, terminállal és tesztfájllal: addig iteráljuk a mintát, amíg meg nem látjuk a jó eredmény.

Hogyan kell írni a mintát?

Írja be a reguláris kifejezést határolók nélkül. Nincs /.../, nincs #...#. Például e-mail címek szövegből való rögzítéséhez csak írja be [\w.+-]+@[\w-]+\.[\w.-]+. Az opciókat (jelzők) jelölőnégyzetek szabályozzák.

Az u (Unicode) opció alapértelmezés szerint be van jelölve. Szinte mindig kívánatos: anélkül, A \w nem ismeri fel az ékezeteket, és egyes minták csendes PCRE hibát adnak vissza UTF-8 karakterláncok.

PCRE opciók

  • i (nem érzékeny a kis- és nagybetűkre): [a-z] a nagybetűket is felismeri.
  • m (többsoros): ^ és $ megegyezik a következő kezdetével és végével minden soron, valamint csak a teljes karakterlánc eleje és vége.
  • s (pont): . a sortöréseket is felismeri. Hasznos mintákhoz amelynek át kell haladnia a bekezdéseken.
  • u (unicode): értelmezi a mintát és a tárgyat UTF-8-ban. Lényeges, amint a szöveg nem ASCII karaktereket (ékezeteket, hangulatjeleket, ideogrammokat) tartalmaz.

Gyakori reguláris példák

  • E-mail cím: [\w.+-]+@[\w-]+\.[\w.-]+ (egyszerűsített forma, elegendő a legtöbb gyakorlati eset; szigorú RFC 5322 nagyon összetett).
  • HTTP/HTTPS URL: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Francia telefonszám: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Francia irányítószám: \d{5}
  • ISO-dátum (ÉÉÉÉ-HH-NN): \d{4}-\d{2}-\d{2}
  • IPv4-cím: (?:\d{1,3}\.){3}\d{1,3}
  • Egész szó: foo (a szóhatárok elkerüli az egyezést futball).
  • Hashtag: #\w+
  • Szemantikai verziószám: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitter ID / X: @\w{1,15}

Elfogott csoportok

A reguláris kifejezések zárójelben tartalmazhatnak csoportokat, amelyek az egyezés egy részét izolálják újrafelhasználás céljából. Például az alice@example.com címre alkalmazott (\w+)@(\w+\.\w+) minta kettőt rögzít csoportok: alice és example.com. Az eszköz ezeket a csoportokat egy oszlopban jeleníti meg dedikált, minden meccs mellett. Az elnevezett csoportok ((?P...)) is felsorolva, név szerint indexelve.

Rögzítés nélküli csoportosításhoz (hasznos kvantor alkalmazásához a csoportok listájának szennyezése nélkül) a (?:...) kódot használja.

ReDoS elleni védelem

A PHP PCRE motorja bizonyos kóros okok miatt katasztrofális visszalépésbe léphet be: egy hosszú, végtelen a karakterláncra alkalmazott (a+)+$ minta blokkolhatja néhány másodpercig a szerveren. Ennek elkerülése érdekében reguláris kifejezés szolgáltatásmegtagadás (ReDoS), az eszköz két korlátot alkalmaz:

  • egy set_time_limit(2) a dolgozói oldalon (a feldolgozás 2 másodperc után megszakad);
  • a pcre.backtrack_limit 100 000-re csökkentése, ami a minták gyors meghibásodását okozza akik túl sok kombinációt fedeznek fel.

Túl drága ok esetén az eszköz a PCRE hibaüzenetet jeleníti meg (preg_last_error_msg()), jellemzően A visszalépési korlát kimerült. Fogalmazd át a sajátodat minta birtokos kvantorok (a++) vagy atomcsoportok használatával ((?>...)), hogy elkerülje a visszalépést.

Gyakran ismételt kérdések

Miért nem egyezik a regexem, pedig JavaScriptben működik?

Ennek az eszköznek a motorja a PCRE (PHP), közel a Perlhez. A szintaxis nagyon hasonló a JavaScripthez, de egyes jellemzők eltérnek: változó hosszúságú mögöttük, bizonyos álnevek Unicode, vagy a kis- és nagybetűk érzékenységének alapértelmezett kezelése. Ha a mintaoldalt tervezi futtatni böngésző, tesztelje JS környezetben is.

Miért nem rögzíti a \w ékezeteket?

Az u jelző nélkül a \w csak a [A-Za-z0-9_] elemet ismeri fel. -val u (Unicode), felismeri az UCD értelemben vett összes betűt, beleértve az ékezetes karaktereket is. A továbblépéshez használjon Unicode osztályokat: \p{L} (betű), \p{N} (szám), \p{P} (központozási jelek).

Megőrzi az eszköz a szövegemet?

Nem. A mintát és a tárgyat a RAM-ban dolgozza fel a PHP-munkás, kitartás nélkül. Nincs adat elküldve nincs naplózva.

Mit tegyek, ha „A visszalépési korlát kimerült” üzenetet kapok?

A mintád túlságosan össze-vissza jár. Keresse a típushoz tartozó beágyazott kvantorokat (a+)+ vagy (\w+)*, amelyek a ReDoS tipikus esetei. Cserélje ki őket eggyel egyértelmű forma: például \w+ a (\w+)* helyett.

Tesztelhetek többsoros mintát?

Igen. Jelölje be az m opciót, hogy a ^ és a $ felismerje a kezdeteket és minden sor vége. Ezenkívül jelölje be a s-t, ha azt szeretné, hogy a . átlépje a sortörések.

Kérés példa

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

Bemeneti séma

Mező Típus Kötelező Alapértelmezett
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Végpontok

  • GET https://cdrn.fr/api/v1/tools - listázza az összes elérhető eszközt
  • GET https://cdrn.fr/api/v1/tools/regex-tester - lekéri ezen eszköz sémáját
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - végrehajtja ezen eszközt JSON payloaddal