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.
W jednej minucie
Powtórzenie to operator po elemencie wzorca, który mówi, ile razy ten element może wystąpić z rzędu.1
Gwiazdka * znaczy zero lub więcej razy, plus + jeden lub więcej, a znak zapytania ? zero lub jeden raz.
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ę.
| Operator | Ile razy | Przykład |
|---|---|---|
* | zero lub więcej | ab*c |
+ | jeden lub więcej | ab+c |
? | zero lub jeden | ab?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.
| Tekst | ab*c | ab+c | ab?c |
|---|---|---|---|
| ac | pasuje | nie | pasuje |
| abc | pasuje | pasuje | pasuje |
| abbc | pasuje | pasuje | nie |
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ć.
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łąd | Skutek | Poprawka |
|---|---|---|
ab* zamiast (ab)* | powtarza tylko b | Ujęcie ab w nawiasy |
colou?r bez -E | szuka znaku ? | Dodaj -E |
+, * lub ? na początku | wynik nieokreślony | Poprzedź operator elementem |
Kolumna „Poprawka” to nasza rekomendacja, nie cytat ze specyfikacji. Drugi wiersz sprawdziliśmy w GNU grep 3.11.
Specyfikacja nie określa wyniku, gdy *, + lub ? stoi na początku wzorca ERE.1
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
grepoperatory+i?działają jako powtórzenia z opcją-E.
Źródła
- Regular Expressions — The Open Group (POSIX.1-2017)sprawdzone 2026-11-03
- GNU Grep 3.12 — GNU Projectsprawdzone 2026-11-03