Wiedza fundamentalna› 1. Wyrażenia regularne›Lekcja 1.3 FUND-03

Regex: powtórzenia * + ?

Po tej lekcji wiesz, jak wzorzec opisuje elementy, które mogą się powtarzać: zero, jeden albo wiele razy. Wiesz też, ile znaków zabiera takie powtórzenie.

~4 min czytania2 pojęcia4 pytaniasprawdzone ze źródłami 3 lis 2026
Źródła (2)

W jednej minucie

Definicja

Powtórzenie to operator po elemencie wzorca, który mówi, ile razy ten element może wystąpić z rzędu.1

Ważne

Gwiazdka * znaczy zero lub więcej razy, plus + jeden lub więcej, a znak zapytania ? zero lub jeden raz.

Zapamiętaj

Powtórzenie dotyczy tylko elementu tuż przed nim. Chcesz powtórzyć więcej? Weź to w nawiasy.

Trzy operatory powtórzeń

Do tej pory każdy element wzorca występował dokładnie raz. Trzy operatory zmieniają tę liczbę.

OperatorIle razyPrzykład
*zero lub więcejab*c
+jeden lub więcejab+c
?zero lub jedenab?c

Przykłady dotyczą zapisu ERE, czyli grep z opcją -E.

Gwiazdka dopasowuje zero lub więcej kolejnych wystąpień elementu.1 Plus wymaga co najmniej jednego.1 Znak zapytania pozwala na zero albo jedno.1

Jak to wygląda na tekście

Ten sam tekst daje inny wynik, zależnie od tego, którego operatora użyjesz po b.

Tekstab*cab+cab?c
acpasujeniepasuje
abcpasujepasujepasuje
abbcpasujepasujenie

Wyniki sprawdziliśmy poleceniem grep -E w wersji 3.11.

printf 'color\ncolour\ncolouur\n' | grep -xE 'colou?r'
# wypisze color i colour, ale nie colouur

Co dokładnie się powtarza

Powtórzenie obejmuje jeden znak albo wyrażenie w nawiasach, które stoi tuż przed nim.1

printf 'ab\nabab\naba\nb\n' > s.txt
grep -xE '(ab)+' s.txt     # wypisze ab i abab
printf 'abab\nabbb\n' | grep -xE 'ab*'   # wypisze tylko abbb

W (ab)+ powtarza się całe ab. W ab* powtarza się tylko b, więc abab do niego nie pasuje. Opcja -x wymaga dopasowania całej linii.2

Ile znaków zabiera powtórzenie

Powtórzenie może pasować do krótszego albo dłuższego fragmentu. Specyfikacja mówi, który wybrać.

Definicja

Najdłuższe dopasowanie to zasada, że gdy od tego samego miejsca pasuje kilka ciągów, wybierany jest najdłuższy z nich.1

echo abbbc | grep -oE 'bb*'   # wypisze bbb, a nie b

Opcja -o wypisuje tylko dopasowaną część linii.2 Wynik bbb pokazuje, że bb* zabrało wszystkie trzy litery.

Częste błędy

Trzy pomyłki zdarzają się najczęściej, gdy zaczynasz używać powtórzeń.

BłądSkutekPoprawka
ab* zamiast (ab)*powtarza tylko bUjęcie ab w nawiasy
colou?r bez -Eszuka znaku ?Dodaj -E
+, * lub ? na początkuwynik nieokreślonyPoprzedź operator elementem

Kolumna „Poprawka” to nasza rekomendacja, nie cytat ze specyfikacji. Drugi wiersz sprawdziliśmy w GNU grep 3.11.

Uwaga — operator bez elementu

Specyfikacja nie określa wyniku, gdy *, + lub ? stoi na początku wzorca ERE.1

Uwaga — kilka operatorów obok siebie

Zapis typu a+* też daje wynik nieokreślony.1 Nie ustawiaj powtórzeń jedno za drugim.

Pytania sprawdzające

Czym różni się ab*c od ab+c?

ab*c dopuszcza zero liter b, więc pasuje do ac. ab+c wymaga co najmniej jednej b, więc do ac nie pasuje.

Kiedy użyć ? zamiast *?

Gdy element może wystąpić najwyżej raz, jak u w colou?r. Gwiazdka dopuszcza też więcej wystąpień.

Dlaczego ab* nie pasuje do całej linii abab?

Powtórzenie obejmuje tylko b stojące tuż przed gwiazdką. Do powtórzenia ab potrzebne są nawiasy: (ab)*.

Wzorzec bb* pasuje do abbbc na kilka sposobów. Który wynik wybierze grep -o?

Najdłuższy, czyli bbb, bo przy kilku możliwościach od tego samego miejsca wybierany jest najdłuższy ciąg.

Podsumowanie

  • Powtórzenie mówi, ile razy element wzorca może wystąpić z rzędu.
  • * to zero lub więcej, + to jeden lub więcej, ? to zero lub jeden.
  • Operator działa na jeden znak albo grupę w nawiasach tuż przed nim.
  • Przy kilku możliwych dopasowaniach od tego samego miejsca wygrywa najdłuższe.
  • Operator na początku wzorca lub kilka operatorów obok siebie daje wynik nieokreślony.
  • W grep operatory + i ? działają jako powtórzenia z opcją -E.

Źródła

  1. Regular Expressions — The Open Group (POSIX.1-2017)sprawdzone 2026-11-03
  2. GNU Grep 3.12 — GNU Projectsprawdzone 2026-11-03