Regex: klasy znaków, kropka i kotwice
Po tej lekcji wiesz, jak wzorzec opisuje, jaki znak stoi w danym miejscu, i jak przypiąć go do początku lub końca linii. Wiesz też, po co są klasy znaków.
W jednej minucie
Wyrażenie nawiasowe to zapis w nawiasach kwadratowych, który pasuje do jednego znaku z określonego zbioru.1
Kropka i nawiasy kwadratowe opisują, jaki znak stoi w danym miejscu. Kotwice ^ i $ opisują, gdzie w linii wzorzec ma pasować.
Szukasz dosłownej kropki i nie chcesz ukośnika? Ujmij ją w nawiasy: [.].1
Kropka: dowolny znak
Kropka zastępuje jeden dowolny znak. Specyfikacja wyklucza tylko znak NUL.1
| Tekst | c.t | Dlaczego |
|---|---|---|
| cat | pasuje | kropka = a |
| cut | pasuje | kropka = u |
| ct | nie pasuje | brak znaku między c i t |
| coat | nie pasuje | między c i t są dwa znaki |
Wyniki sprawdziliśmy poleceniem grep w wersji 3.11.
Nawiasy kwadratowe: jeden znak z zestawu
Nawiasy kwadratowe wymieniają znaki, z których dokładnie jeden ma pasować. Całe wyrażenie zajmuje jedno miejsce we wzorcu.1
| Zapis | Pasuje do | Przykład |
|---|---|---|
[ae] | jednego znaku a lub e | gr[ae]y: gray, grey |
[0-9] | jednej cyfry z zakresu | a[0-9]: a1 |
[^0-9] | jednego znaku, który nie jest cyfrą | [^0-9]+: abc |
Przykłady sprawdziliśmy w GNU grep 3.11.
Zakres 0-9 obejmuje wszystkie znaki między dwoma podanymi, włącznie z nimi, ale tylko w ustawieniach POSIX.1 Znak ^ na początku zestawu odwraca jego znaczenie.1
W innych ustawieniach regionalnych zakres ma zachowanie nieokreślone.1 Zakresu liter, np. a-z, nie traktuj jako pewnego zbioru wszystkich liter.
Klasy znaków
Klasa znaków to gotowa nazwa zamiast ręcznej listy, na przykład dla wszystkich cyfr.
Klasa znaków to nazwany zestaw znaków, np. cyfr albo liter, który zapisujesz wewnątrz wyrażenia nawiasowego.1
| Klasa | Znaki |
|---|---|
[:digit:] | cyfry |
[:alpha:] | litery |
[:alnum:] | litery i cyfry |
[:upper:] | wielkie litery |
[:lower:] | małe litery |
[:space:] | znaki odstępu |
Nazwy pochodzą ze specyfikacji. Opis w drugiej kolumnie to nasz skrót.
Specyfikacja wymaga tych klas we wszystkich ustawieniach regionalnych.1
printf '2026\nrok2026\nabc\n' | grep -xE '[[:digit:]]+'
# wypisze tylko 2026
# klasa stoi wewnątrz nawiasów: [[:digit:]], nie [:digit:]
Kotwice: gdzie ma pasować wzorzec
Do tej pory wzorzec mógł pasować w dowolnym miejscu linii. Kotwice to zmieniają.
Kotwica to znak ^ lub $, który ogranicza dopasowanie do początku lub końca tekstu.1
| Tekst | ^kot | kot$ | ^kot$ |
|---|---|---|---|
| kot | pasuje | pasuje | pasuje |
| kotlet | pasuje | nie | nie |
| pies kot | nie | pasuje | nie |
| mokot | nie | pasuje | nie |
Wyniki sprawdziliśmy poleceniem grep w wersji 3.11.
Znak ^ przypina wzorzec do początku tekstu.1 Dolar $ robi to samo z końcem. Oba razem dopasowują tylko cały tekst.1 W grep tekstem jest jedna linia.1
Opcja -x z grep działa jak otoczenie wzorca znakami ^ i $.2
Częste błędy
Trzy pomyłki zdarzają się najczęściej przy zbiorach znaków i kotwicach.
| Błąd | Skutek | Poprawka |
|---|---|---|
[:digit:] zamiast [[:digit:]] | grep zgłasza błąd | Wstaw klasę w nawiasy kwadratowe |
[^a] mylone z ^a | inne znaczenie | [^a] to nie-a, ^a to a na początku |
[a-z] jako wszystkie litery | zależy od ustawień | Użyj klasy [[:lower:]] |
Kolumna „Poprawka” to nasza rekomendacja, nie cytat ze specyfikacji. Pierwszy wiersz sprawdziliśmy w GNU grep 3.11.
Wewnątrz nawiasów kropka i gwiazdka są zwykłymi znakami.1 Wzorzec [.*] szuka kropki albo gwiazdki.
Pytania sprawdzające
Dlaczego c.t nie pasuje do tekstu coat?
Kropka zastępuje dokładnie jeden znak, a między c i t w coat są dwa znaki.
Czym różni się [^0-9] od ^0?
[^0-9] to jeden znak, który nie jest cyfrą. ^0 to zero na początku linii. Znak ^ ma inne znaczenie w zależności od miejsca.
Dlaczego klasę [:digit:] piszesz w podwójnych nawiasach?
Klasa jest elementem wyrażenia nawiasowego, więc musi stanąć wewnątrz nawiasów kwadratowych: [[:digit:]]. Samo [:digit:] to błąd.
Jak dopasować linię, która jest dokładnie słowem kot?
Obułóż wzorzec kotwicami: ^kot$. Alternatywą jest opcja -x.
Podsumowanie
- Kropka dopasowuje dowolny jeden znak poza NUL.
- Wyrażenie nawiasowe pasuje do jednego znaku z zestawu, a
^na jego początku odwraca zestaw. - Zakres liter zależy od ustawień regionalnych, więc bezpieczniej używać klas znaków.
- Klasa znaków, np.
[:digit:], stoi wewnątrz nawiasów kwadratowych. - Kotwice
^i$przypinają wzorzec do początku i końca linii. - Wewnątrz nawiasów kropka i gwiazdka tracą znaczenie specjalne.
Źródła
- Regular Expressions — The Open Group (POSIX.1-2017)sprawdzone 2026-11-03
- GNU Grep 3.12 — GNU Projectsprawdzone 2026-11-03