Regex: alternatywa i grupowanie
Po tej lekcji wiesz, jak zapisać „albo to, albo tamto” i jak nawiasy ograniczają zasięg alternatywy. Poznasz też różnicę między BRE a ERE i opcję -E.
W jednej minucie
Alternatywa to operator |, który dopasowuje tekst pasujący do któregokolwiek z dwóch wzorców.1
Alternatywa mówi „albo to, albo tamto”. Nawiasy mówią, gdzie kończy się jedna opcja, a zaczyna reszta wzorca.
Używasz | albo nawiasów w grep? Dodaj opcję -E.
Dwa dialekty: BRE i ERE
Specyfikacja opisuje dwa zapisy wyrażeń regularnych. Różnią się tym, które znaki są specjalne.
BRE to podstawowy zapis wyrażeń regularnych, którego używa większość narzędzi.1
ERE to rozszerzony zapis wyrażeń regularnych, który wspierają niektóre narzędzia zamiast podstawowego.1
| Zapis | Bez -E (BRE) | Z -E (ERE) |
|---|---|---|
| Alternatywa | | to zwykły znak | | łączy opcje |
| Grupa | \( i \) | ( i ) |
Wiersz o alternatywie sprawdziliśmy w GNU grep 3.11.
W grep zapis ERE włączasz opcją -E.2 W BRE grupę tworzą znaki \( i \).1
Alternatywa: albo jedno, albo drugie
Kreska pionowa | łączy dwa wzorce w jeden, który pasuje do każdego z nich.
Wzorzec kot|pies pasuje do linii z słowem kot oraz do linii z słowem pies.
printf 'kot\npies\nchomik\n' > a.txt
grep -E 'kot|pies' a.txt # wypisze kot i pies
Linia chomik nie pasuje do żadnej opcji, więc grep jej nie wypisuje.
Nawiasy: grupowanie
Alternatywa obejmuje tyle, na ile jej pozwolisz. Nawiasy wyznaczają jej zasięg.
Grupowanie to ujęcie fragmentu wzorca w nawiasy, żeby traktować go jak jedną całość.1
| Tekst | gr(a|e)y | gra|ey |
|---|---|---|
| gray | pasuje | pasuje |
| grey | pasuje | pasuje |
| ey | nie pasuje | pasuje |
| gra | nie pasuje | pasuje |
Wyniki sprawdziliśmy poleceniem grep -E w wersji 3.11.
W gr(a|e)y opcje to a i e. W gra|ey opcje to całe gra i ey, bo nic ich nie ogranicza.
Pierwszeństwo operatorów
Gdy we wzorcu jest kilka operatorów, kolejność decyduje, co z czym się wiąże.1
| Poziom | Konstrukcja | Skutek |
|---|---|---|
| 1 | Grupowanie () | wiąże najmocniej |
| 2 | Konkatenacja | wiąże słabiej niż grupa |
| 3 | Alternatywa | | wiąże najsłabiej |
Pominęliśmy pozostałe poziomy z tabeli POSIX. Kolumna „Skutek” to nasz opis.
Wzorzec abba|cde pasuje do abba albo do cde, a nie do abbade ani abbcde.1
printf 'abba\ncde\nabbade\nabbcde\n' > c.txt
grep -xE 'abba|cde' c.txt # wypisze abba i cde
Opcja -x wymaga, by pasowała cała linia.2 Dzięki temu widać, że abbade nie jest dopasowaniem.
Częste błędy
Trzy pomyłki powtarzają się najczęściej, gdy zaczynasz używać alternatywy.
| Błąd | Skutek | Poprawka |
|---|---|---|
kot|pies bez -E | szuka kreski | Dodaj -E |
gra|ey zamiast gr(a|e)y | za szeroko | Ujęcie opcji w nawiasy |
| na początku lub końcu | wynik nieokreślony | Dopisz brakującą opcję albo usuń kreskę |
Kolumna „Poprawka” to nasza rekomendacja, nie cytat ze specyfikacji.
Specyfikacja nie określa wyniku, gdy | stoi na początku albo na końcu wzorca ERE.1
Chcesz znaleźć sam znak |? W ERE poprzedź go ukośnikiem wstecznym: \|.1
Pytania sprawdzające
Dlaczego grep 'kot|pies' plik nie działa jak alternatywa?
Bez -E wzorzec jest w trybie BRE, a tam | to zwykły znak. Opcja -E włącza ERE, w którym | łączy opcje.
Czym różni się gr(a|e)y od gra|ey?
W pierwszym nawiasy ograniczają alternatywę do jednego znaku, więc pasuje tylko gray i grey. W drugim opcje to całe gra i ey.
Dlaczego abba|cde nie pasuje do całej linii abbade?
Konkatenacja wiąże mocniej niż alternatywa, więc opcje to abba i cde, a nie abbade czy abbcde.
Co zmienia opcja -E w grep?
Włącza rozszerzony zapis wyrażeń regularnych (ERE), w którym | oraz ( i ) są operatorami.
Podsumowanie
- Alternatywa
|dopasowuje tekst pasujący do któregokolwiek z dwóch wzorców. - BRE to zapis podstawowy, ERE rozszerzony; w
grepERE włączasz opcją-E. - Nawiasy grupują fragment wzorca i wyznaczają zasięg alternatywy.
- Konkatenacja wiąże mocniej niż alternatywa, a grupowanie mocniej niż konkatenacja.
|na początku lub końcu wzorca ERE daje wynik nieokreślony.- Znak
|można dopasować dosłownie, poprzedzając go ukośnikiem wstecznym.
Źródła
- Regular Expressions — The Open Group (POSIX.1-2017)sprawdzone 2026-11-03
- GNU Grep 3.12 — GNU Projectsprawdzone 2026-11-03