Co oznacza « testowanie wyrażenia regularnego » ?
Testowanie wyrażenia regularnego (« regex test online », « tester regex javascript ») oznacza uruchomienie wzorca na prawdziwym tekście i dokładne obserwowanie tego, co silnik zwraca: pasujących ciągów, ich pozycji oraz wartości grup przechwytywania. Wzorzec, który « wydaje się słuszny », nic nie mówi, dopóki nie pobiegnie na Twoich danych — to jedyna różnica, która się liczy między wyrażeniem z samouczka a wyrażeniem produkcyjnym.
Test odpowiada na trzy różne pytania. Czy dopasowuje się : tabela dopasowań mówi to wprost. Gdzie i ile razy : indeks i długość pokazują, czy kotwica była na właściwym miejscu. Co przechwytuje : grupy numerowane lub o nazwie pokazują, czy część, którą chciałeś wyciągnąć, jest rzeczywiście tą właściwą.
Metaznaki, które robią różnicę
Kropka . zastępuje dowolny znak poza nową linią — stąd flaga s gdy Twój tekst jest wieloliniowy. Kwantyfikatory *, + i ? są zachłanne : zatrzymują się przy pierwszej liczbie powtórzeń, która wystarcza. Przyrostek ? (*?, +?, {2,5}?) odwraca to zachowanie i tworzy wersję leniwą, którą niemal zawsze warto wybierać, gdy .* pochłania koniec linii.
Nawiasy kwadratowe definiują klasę: [abc] akceptuje znak spośród wymienionych, [^abc] wszystko poza nimi, [a-z0-9] zakres. Uwaga na negację na początku klasy — [^...] tylko dla pierwszej pozycji, w przeciwnym razie ^ znów czytane jest dosłownie. Pipe | rozdziela alternatywy i zachowuje się jak operator o niskim priorytecie: ^cat|dog$ oznacza « cały tekst to cat » albo « cały tekst to dog », a nie « cat lub dog na początku albo na końcu » — wtedy trzeba zgrupować: ^(?:cat|dog)$.
Grupy, lookahead i lookbehind
Nawiasy przechwytują. Grupa 1 jest dostępna przez $1 po stronie zamiany, a \1 po stronie wzorca grupy o nazwie przez $<nom> i \k<nom> — znacznie czytelniej już od trzech grup. (?:...) grupuje bez tworzenia numeru — warto je wybierać, gdy przechwytujesz wyłącznie dla struktury.
Wyrażenia (lookaround) sprawdzają bez pobierania znaków: (?=...) wymaga, aby to, co następuje, pasowało, (?!...) zabrania tego, (?<=...) i (?<!...) robią to samo dla tego, co poprzedza. W ten sposób wymusza się specjalny znak w haśle, nie wliczając go do przechwycenia: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS: gdy wyrażenie regularne staje się bombą z opóźnionym zapłonem
Zjawisko ReDoS (Regular Expression Denial of Service) wynika z backtrackingu : wobec wejścia prawie zgodnego wzorzec taki jak (a+)+$ przejmuje wszystkie sposoby pocięcia « a » przed porażką, a liczba wybuchów rośnie wykładniczo. Dwa odruchy: przetestuj wzorzec na realistycznym wolumenie — karta Wydajność zrobi to za Ciebie — i nigdy nie uruchamiaj niesprawdzonego wyrażenia regularnego na wejściu z zewnątrz bez limitu rozmiaru. Na serwerze zablokowane wyrażenie regularne zawiesza cały worker do wygaśnięcia limitu czasu.
JavaScript, PCRE, Python: te same podstawy, kilka różnic
Tester używa natywnego silnika przeglądarki, czyli ECMAScript. Podstawowe składnie — klasy, kwantyfikatory, grupy, lookahead, flagi g i m s u y — są wspólne dla PCRE (PHP, Perl), dla Pythona z re, dla Javy i Go. Różnice dotyczą głównie lookbehindu (długo nieobecnego w JavaScript, dziś obsługiwanego), właściwości Unicode oraz flag we wzorcu jak (?i), właściwych dla PCRE. Przeniesienie wzorca z jednego języka do drugiego pozostaje więc ćwiczeniem w detalach — bez improwizacji.
Polecane dla
Programiści front-end i back-end (walidacja formularzy, przetwarzanie logów, migracja danych), ops i DevOps (filtry konfiguracji, reguły WAF), testerzy i analitycy (wyciąganie kolumn, kontrola formatu), redaktorzy i analitycy danych (czyszczenie plików), studenci (zrozumienie metaznaków) oraz każda osoba, która potrzebuje testera wyrażeń regularnych szybkiego, kompletnego i poufnego — a uzupełniają go formatowanie JSON, kodowanie i dekodowanie URL, kodowanie i dekodowanie Base64 oraz kodowanie i dekodowanie JWT.