Regex do wyszukiwania i zamiany tekstu — zaawansowane techniki
Wyszukiwanie i zamiana z użyciem wyrażeń regularnych to jedna z najcenniejszych umiejętności w pracy z kodem i danymi. Dzięki grupom przechwytującym możesz nie tylko znaleźć wzorce, ale też restrukturyzować i transformować tekst w potężny sposób — zamienić format daty z DD.MM.YYYY na YYYY-MM-DD, przeformować numery telefonów, przekonwertować nazwy zmiennych z camelCase na snake_case, wyodrębnić dane z logów. Tester Regex na WikiPlus wspiera podgląd zamiany w czasie rzeczywistym.
Grupy przechwytujące i backreferences w zamianie
Grupy przechwytujące () to supermocarstwo regex przy zamianie tekstu. Gdy dopasowujesz wzorzec z grupami, możesz odwoływać się do ich treści w ciągu zastępczym za pomocą $1, $2... (JavaScript) lub \1, \2... (Python, PHP). Przykład: zamiana formatu daty z 12.05.2026 na 2026-05-12. Wzorzec: `(\d{2})\.(\d{2})\.(\d{4})`. Zamiana: `$3-$2-$1` (JS) lub `\3-\2-\1` (Python). Grupy nazwane (?<name>...) czynią kod jeszcze bardziej czytelnym: wzorzec `(?<dzien>\d{2})\.(?<miesiac>\d{2})\.(?<rok>\d{4})`, zamiana `$<rok>-$<miesiac>-$<dzien>`. Backreferences działają też w samym wzorcu: `(.)\1` dopasowuje dwa identyczne kolejne znaki (np. 'aa', 'bb').
Praktyczne transformacje tekstu z regex
Oto kilka praktycznych transformacji, które znacznie przyspieszają pracę z danymi. Konwersja camelCase na snake_case: wzorzec `([A-Z])`, zamiana `_$1` (+ toLowerCase). Konwersja snake_case na camelCase wymaga bardziej złożonej logiki z funkcją callback. Usuwanie HTML tagów: wzorzec `<[^>]+>`, zamiana pustym ciągiem. Ekstrakcja danych z logów: wzorzec `(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (ERROR|WARN|INFO) (.+)` — grupy przechwytują datę, czas, poziom i komunikat. Normalizacja spacji: wzorzec `\s+`, zamiana pojedynczą spacją ` `. Usuwanie komentarzy C-style: wzorzec `/\*[\s\S]*?\*/`, zamiana pustym ciągiem. Dodawanie spacji po przecinkach: wzorzec `,(?!\s)`, zamiana `, `.
Regex w edytorach kodu — VS Code i IntelliJ
Nowoczesne edytory kodu mają potężne wsparcie dla regex w funkcji wyszukiwania i zamiany. W VS Code (Ctrl+H) włącz regex przyciskiem .* — możesz wtedy używać pełnych wyrażeń regularnych z grupami. Np. zmiana importów: znajdź `import (\w+) from '([^']+)'`, zamień na `const $1 = require('$2')`. IntelliJ IDEA (Ctrl+R) obsługuje regex z grupami przechwytującymi oznaczonymi $1 w polu zastępowania. Vim używa składni `:%s/wzorzec/zamiana/g` z backreferences jako `\1`. Sed (CLI): `sed 's/wzorzec/zamiana/g'` — niezastąpiony w skryptach powłoki. Awk oferuje funkcję gsub() do globalnej zamiany. Dla masowych operacji na wielu plikach: grep -r + sed w skrypcie bash lub narzędzie rg (ripgrep) z --replace.
Lookahead i lookbehind w zamianie — zaawansowane wzorce
Asercje lookahead i lookbehind pozwalają dopasowywać tekst z uwzględnieniem kontekstu bez włączania kontekstu do samego dopasowania — co czyni je niezwykle użytecznymi przy precyzyjnych zamianach. Positive lookahead (?=...): dodaj prefiks tylko przed słowem bezpośrednio poprzedzającym cyfrę — `\b\w+(?=\d)`. Negative lookahead (?!...): dopasuj słowo 'http' tylko gdy nie jest followed by 's' — `http(?!s)` dopasuje 'http://' ale nie 'https://'. Positive lookbehind (?<=...): dopasuj liczbę tylko po znaku $ — `(?<=\$)\d+`. Negative lookbehind (?<!...): dopasuj słowo 'free' ale nie gdy poprzedzone 'gluten-' — `(?<!gluten-)free`. Połączenie lookahead i lookbehind daje chirurgiczną precyzję: `(?<=href=")[^"]+(?=")` wyodrębni wartości atrybutów href bez cudzysłowów.
Często zadawane pytania
- Jak zamienić daty z formatu polskiego na ISO za pomocą regex?
- Wzorzec: `(\d{2})\.(\d{2})\.(\d{4})`. Zamiana (JavaScript): `$3-$2-$1`. Np. '12.05.2026' zamieni się na '2026-05-12'. W Pythonie: `re.sub(r'(\d{2})\.(\d{2})\.(\d{4})', r'\3-\2-\1', text)`. Przetestuj w testerze regex przed użyciem na produkcji.
- Czy regex może zastąpić tekst z uwzględnieniem wielkości liter w wyniku?
- Standardowy regex zastępuje tekstem dosłownie. Aby zachować wielkość liter (np. Hello → World, hello → world), użyj funkcji callback w replace: `str.replace(/hello/gi, m => m[0]==='H' ? 'World' : 'world')`. Niektóre edytory (VS Code) obsługują `\U`, `\L` dla zmiany wielkości w ciągu zastępczym.
- Ile grup przechwytujących można użyć w jednym regex?
- Standard nie narzuca limitu, ale większość implementacji obsługuje co najmniej 99 grup numerowanych ($1-$99). W praktyce więcej niż 10 grup to sygnał, że wzorzec jest zbyt skomplikowany — rozważ podzielenie operacji na kilka kroków lub użycie named groups dla czytelności.