Wyrażenia regularne w praktyce

Wyrażenie regularne opisuje zbiór napisów: \d{4}-\d{2}-\d{2} rozpoznaje daty zapisane jako 2025-03-14, \d{2}-\d{3} polski kod pocztowy. Nawiasy okrągłe tworzą grupy przechwytujące, które zamiana może wykorzystać jako $1, $2 lub po nazwie, jeśli grupa ją ma.

Flagi zmieniają działanie: g szuka wszystkich dopasowań zamiast pierwszego, i ignoruje wielkość liter, m sprawia, że ^ i $ działają w każdej linii, s pozwala kropce dopasować znak nowej linii, u włącza klasy Unicode, takie jak \p{L}. Bez g zamiana zmienia tylko pierwsze wystąpienie.

Niektóre wzorce, jak (a+)+$ czy (\w+\s?)*$, na tekście, który prawie pasuje, sprawdzają wykładniczą liczbę kombinacji i mogą zawiesić przeglądarkę lub serwer: to ReDoS. Tutaj test działa w osobnym procesie i jest przerywany po sekundzie, więc strona pozostaje używalna i informuje o problemie.

Częste błędy

  • Zapominanie o podwojeniu ukośników wstecznych, gdy wyrażenie trafia do napisu w kodzie: tu pisze się \d, w napisie JavaScript "\\d".
  • Używanie .* tam, gdzie potrzeba .*?: zachłanny kwantyfikator zabiera wszystko aż do ostatniego możliwego wystąpienia.
  • Zagnieżdżanie kwantyfikatorów, jak (a+)+ lub (a|a)*: to najczęstsza przyczyna katastrofalnego backtrackingu.

Najczęstsze pytania

Jakiego silnika wyrażeń regularnych używa tester?

Silnika JavaScript (ECMAScript) twojej przeglądarki. Jest bardzo podobny do PCRE z PHP, ale brakuje niektórych funkcji, np. grup atomowych i kwantyfikatorów zaborczych.

Jak użyć grupy w zamianie?

Przez $1, $2… dla grup numerowanych, $ z nazwą w nawiasach ostrych dla nazwanych i $& dla całego dopasowania. Dosłowny znak dolara zapisuje się jako $$.

Czy wpisany tekst jest gdzieś wysyłany?

Nie: wszystko dzieje się w przeglądarce. Wzorzec i tekst trafiają tylko do adresu strony, aby można ją było udostępnić, i tylko wtedy, gdy są krótkie.

Jak działa to obliczenie

Wzorzec jest kompilowany przez new RegExp(wzorzec, flagi) i stosowany przez String.prototype.matchAll, zawsze z dodaną flagą g, aby przejść przez tekst; bez g w zapytaniu zostaje tylko pierwsze dopasowanie. Zamiana używa String.prototype.replace z wybranymi flagami. Wykonanie odbywa się w Web Workerze, który jest kończony, jeśli nie odpowie w ciągu 1 sekundy; wyświetla się najwyżej 1000 dopasowań.