WikiPlus

Regex w JavaScript i Python — różnice i praktyczny przewodnik

Wyrażenia regularne są obecne niemal w każdym języku programowania, ale ich implementacje różnią się subtelnymi detalami, które mogą sprawić niemałe kłopoty. Wzorzec działający perfekcyjnie w JavaScript może zachować się inaczej w Pythonie, PHP czy Javie. Ten przewodnik skupia się na dwóch najpopularniejszych środowiskach — JavaScript i Python — porównując ich implementacje regex, zwracając uwagę na pułapki i pokazując, jak tester regex online pomaga uniknąć niespodzianek w produkcji.

Regex w JavaScript — metody i użycie

JavaScript oferuje dwa sposoby tworzenia wyrażeń regularnych: literał /wzorzec/flagi (np. /\d+/g) i konstruktor new RegExp('\\d+', 'g'). Główne metody to: test() — zwraca true/false, idealny do walidacji. exec() — zwraca tablicę z pierwszym dopasowaniem i grupami przechwytującymi. match() — na String, zwraca tablicę dopasowań (z flagą g) lub szczegóły pierwszego dopasowania (bez g). matchAll() — zwraca iterator wszystkich dopasowań z grupami. replace() — zastępuje dopasowania, może używać $1, $2... dla grup. replaceAll() — zastępuje wszystkie dopasowania. split() — dzieli ciąg wg wzorca. Uwaga na pułapkę: RegExp z flagą g ma stan wewnętrzny lastIndex — wielokrotne wywoływanie test() lub exec() na tym samym obiekcie może dawać nieoczekiwane wyniki.

Regex w Pythonie — moduł re i re2

Python używa modułu re (wbudowanego) lub re2 (zewnętrzna biblioteka Google). Kluczowe funkcje: re.match() — sprawdza dopasowanie na początku ciągu. re.search() — szuka pierwszego dopasowania gdziekolwiek. re.findall() — zwraca listę wszystkich dopasowań. re.finditer() — iterator obiektów Match. re.sub() — zastępuje dopasowania. re.split() — dzieli ciąg. W Pythonie używa się surowych ciągów r'wzorzec' aby uniknąć podwójnego backslashowania — r'\d+' zamiast '\\d+'. Grupy przechwytujące: match.group(0) — całe dopasowanie, match.group(1) — pierwsza grupa, match.group('name') — dla grup nazwanych. Python obsługuje flagi przez stałe: re.IGNORECASE (re.I), re.MULTILINE (re.M), re.DOTALL (re.S), re.VERBOSE (re.X) — ta ostatnia pozwala pisać regex wieloliniowo z komentarzami.

Kluczowe różnice między JavaScript a Python regex

Choć obu języki korzystają ze zbliżonej składni (dialekt PCRE-like), są istotne różnice. Named groups: JavaScript używa (?<name>...) z $ ES2018, Python od zawsze (?P<name>...) — dwie różne składnie. Lookbehind: Python obsługuje zmiennej długości lookbehind, JavaScript ES2018 też go obsługuje, ale starsze wersje nie. Atomic groups i possessive quantifiers: Python (przez moduł regex) i PHP je obsługują, standardowy JavaScript nie. Unicode: Python domyślnie rozpoznaje \w jako znaki Unicode (w tym ą, ę, ó), JavaScript bez flagi u traktuje tylko ASCII — istotna różnica przy pracy z polskim tekstem! Obsługa nowych linii przez `.`: Python re.DOTALL, JavaScript flaga s (od ES2018). Tester regex online zazwyczaj używa silnika JavaScript, więc rezultaty mogą się różnić od Pythona.

Typowe pułapki regex i jak ich unikać

Nawet doświadczeni programiści wpadają w pewne pułapki regex. Catastrophic backtracking: wzorzec jak (a+)+ na ciągu 'aaaaaaaaab' może zawiesić program — silnik regex próbuje wykładniczo wielu kombinacji. Zawsze testuj regex na pesymistycznych danych. Greedy vs lazy: `<.+>` w HTML dopasuje od pierwszego < do ostatniego > w linii, nie poszczególne tagi — użyj `<.+?>`. Cudzysłowy i apostrofy: różne języki używają różnych metaznaków ucieczki. CRLF vs LF: na Windows linie kończą się \r\n, na Unix \n — może to wpłynąć na dopasowania ^ i $. Unicode: polskie znaki (ą, ę, ó, ś, ź, ż, ć, ń) nie są w klasie \w bez flagi Unicode w JavaScript. Rozwiązanie: używaj testera z realnymi danymi przed wdrożeniem.

Często zadawane pytania

Jak obsłużyć polskie znaki w regex?
W JavaScript dodaj flagę u (unicode): /[a-zą-ź]/ui. Możesz też jawnie wymienić polskie litery: [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]. W Pythonie moduł re domyślnie obsługuje Unicode, więc \w dopasowuje polskie litery w trybie str (Python 3).
Czy regex może parsować HTML?
Technicznie tak, ale to zła praktyka. HTML jest językiem nieregularnym z zagnieżdżonymi strukturami, które regex nie może niezawodnie parsować. Użyj parsera HTML: DOMParser w przeglądarce, BeautifulSoup w Pythonie, cheerio w Node.js. Regex do HTML nadaje się tylko do bardzo prostych, jednorazowych zadań na kontrolowanym, prostym HTML.
Jak testować regex bez dostępu do internetu?
VS Code ma wbudowaną walidację regex dla JavaScript i TypeScript. Możesz też testować bezpośrednio w konsoli przeglądarki (F12): /wzorzec/g.test('tekst'). W Pythonie: `import re; re.findall(r'wzorzec', 'tekst')`. Narzędzia offline: Expresso (Windows), regex-cli (npm). Dla projektów wymagających offline, tester WikiPlus może być uruchomiony lokalnie.