Lekcje modułu (3/4)
Grupy bez przechwytywania: `(?:...)`
Często nawiasy są potrzebne tylko do grupowania (kwantyfikowania, stosowania alternatyw), a NIE do wyodrębniania wartości. W takim przypadku należy użyć wersji nieprzechwytującej: (?:...). Działa ona identycznie jak (...), ale nie tworzy numerowanej grupy.
Pattern: (?:https?)://(\w+\.\w+)
Sample: https://example.com e http://test.org
Match e gruppi:
match = "https://example.com" gruppo1 = "example.com"
match = "http://test.org" gruppo1 = "test.org"Zapis (?:https?) grupuje schemat w celu zastosowania kwantyfikatora ?, ale nie jesteśmy zainteresowani wyodrębnieniem https jako grupy: grupa 1 to bezpośrednio domena.
Dlaczego warto jej używać
- Czytelność: czytelnik od razu rozumie, że grupa służy jedynie strukturze, a nie wyodrębnieniu wartości.
- Wydajność: silnik nie musi przechowywać dopasowania grupy w pamięci.
- Czysta numeracja: grupy numerowane pozostają powiązane z "informacjami, których naprawdę potrzebuję", bez zbędnych zakłóceń.
Optymalizacja za pomocą grup nieprzechwytujących
Użycie zapisu (?:...) informuje silnik, aby zastosował reguły grupowania i kwantyfikatorów bez marnowania pamięci na przechowywanie pośrednich wyników dopasowania. Jest to wysoce zalecane w ciężkich pętlach lub przy przetwarzaniu bardzo długich tekstów.
Spróbuj sam
Wyodrębnij domenę (`example.com`, `test.org`…) z każdego adresu URL w tekście. Użyj `(?:https?)` dla protokołu (nie ma potrzeby go przechwytywać) i pojedynczej grupy dla domeny.
Pokaż wskazówkę
Zmień pierwszą grupę z (https?) na (?:https?): nie ma potrzeby jej przechwytywania, chcesz tylko domenę.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Znajdź każde powtórzenie `ab` jako pojedyncze dopasowanie, ale BEZ przechwytywania grupy (ponieważ potrzebujesz tylko całego dopasowania).
Pokaż wskazówkę
Taka sama składnia jak w poprzedniej lekcji, ale z użyciem (?:ab)+ zamiast (ab)+.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Znajdź cyfry ceny, po których opcjonalnie występują części dziesiętne wewnątrz grupy nieprzechwytującej, np. `100` lub `100.50`.
Pokaż wskazówkę
Użyj (?:\.\d{2})?, aby uczynić część dziesiętną opcjonalną bez jej przechwytywania.
Rozwiązanie dostępne po 3 próbach