Przejdź do treści

Ściągawka regex

Wyrażenia regularne są na tyle zwięzłe, że składnię łatwiej sprawdzić niż zapamiętać. Ta strona zawiera ją w całości na jednym ekranie — klasy, kwantyfikatory, kotwice, grupy, lookaround, escapowanie i flagi — z działającym przykładem dla każdego wiersza.

Odmiana to JavaScript, czyli to, co działa w Twojej przeglądarce i czego używa tester regex na tej stronie. Większość z tego jest identyczna w Pythonie, Javie, Go i PCRE; tam, gdzie odmiany się różnią, różnią się na obrzeżach — obsługa lookbehind, składnia grup nazwanych oraz to, czy \d oznacza „cyfrę ASCII”, czy „dowolną cyfrę Unicode”.

Za większość niespodzianek odpowiadają dwie rzeczy. Kwantyfikatory są zachłanne: biorą wszystko, co się da, i oddają dopiero, gdy reszta wzorca zawiedzie, dlatego <.+> pochłania dwa znaczniki, a <.+?> nie. A alternatywa wiąże najsłabiej ze wszystkiego, więc ^a|b$ oznacza „zaczyna się od a lub kończy się na b” — a nie to, co większość ludzi ma na myśli, pisząc to.

Klasy znaków

11

Skróty działają tylko dla ASCII, chyba że dodasz flagę u i użyjesz sekwencji escape właściwości Unicode.

SkładniaZnaczeniePrzykład
.Dowolny znak z wyjątkiem złamania liniiDodaj flagę s, aby dopasowywał także znaki nowej linii./a.c/"abc" "abc"
\dCyfra, 0–9/\d+/"order 42" "42"
\DWszystko, co nie jest cyfrą/\D+/"42abc" "abc"
\wLitera, cyfra lub podkreślenieTylko ASCII — „é” nie jest \w./\w+/"user_1!" "user_1"
\WWszystko, czego \w nie dopasowuje/\W+/"a++b" "++"
\sDowolny biały znak, w tym tabulatory i znaki nowej linii/\s+/"a \t b" " \t "
\SDowolny znak niebędący białym znakiem/\S+/" hi" "hi"
[abc]Dowolny z wymienionych znaków/[aeiou]/"rhythm and" "a"
[^abc]Dowolny znak z wyjątkiem wymienionych/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Zakres znaków/[a-f]+/"zzabcz" "abc"
\p{L}Dowolna litera Unicode (wymaga flagi u)/\p{L}+/"42 café" "café"

Kwantyfikatory

7

Wszystkie są domyślnie zachłanne: biorą tyle, ile mogą, i oddają tylko wtedy, gdy reszta wzorca zawiedzie.

SkładniaZnaczeniePrzykład
*Zero lub więcej/ab*/"a" "a"
+Jeden lub więcej/ab+/"abbb" "abbb"
?Zero lub jeden — czyni to opcjonalnym/colou?r/"color" "color"
{3}Dokładnie trzy/\d{3}/"id 12345" "123"
{2,}Dwa lub więcej/a{2,}/"aaa" "aaa"
{2,4}Od dwóch do czterech/a{2,4}/"aaaaa" "aaaa"
*?Leniwy — bierze jak najmniejZachłanny <.+> pochłonąłby oba znaczniki./<.+?>/"<a><b>" "<a>"

Kotwice i granice

4

Dopasowują pozycję, a nie znak, więc niczego nie konsumują.

SkładniaZnaczeniePrzykład
^Początek ciągu lub linii z flagą m/^a/"abc" "a"
$Koniec ciągu lub linii z flagą m/c$/"abc" "c"
\bGranica słowaTo właśnie powstrzymuje dopasowanie „cat” wewnątrz „concatenate”./\bcat\b/"the cat sat" "cat"
\BNie granica słowa/\Bcat/"concatenate" "cat"

Grupy i alternatywa

5
SkładniaZnaczeniePrzykład
(abc)Grupa przechwytująca — zapamiętana do podstawienia/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Grupowanie bez przechwytywaniaUżywaj tego, gdy potrzebujesz tylko grupowania; dzięki temu numery przechwyceń zachowują sens./(?:ab)+/"abab" "abab"
(?<name>…)Nazwana grupa przechwytująca/(?<year>\d{4})/"in 2026" "2026"
a|bJedna lub druga strona — alternatywaAlternatywa ma najniższy priorytet: ^a|b$ to „^a” lub „b$”, a nie „^(a|b)$”./cat|dog/"one dog" "dog"
\1Odwołanie wsteczne do pierwszej grupy/(\w)\1/"letter" "tt"

Lookaround

4

Asercje dotyczące tego, co otacza daną pozycję. Same niczego nie dopasowują, co czyni je bezpiecznymi do łączenia.

SkładniaZnaczeniePrzykład
(?=…)Lookahead — po którym następuje to/\d+(?= kg)/"80 kg" "80"
(?!…)Negatywny lookahead — po którym nie następuje to/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — poprzedzony tym/(?<=\$)\d+/"costs $40" "40"
(?<!…)Negatywny lookbehind — niepoprzedzony tym/(?<!\$)\b\d+/"about 40" "40"

Escapowanie

5

Te dwanaście znaków wymaga odwrotnego ukośnika, aby były traktowane dosłownie.

SkładniaZnaczeniePrzykład
\.Dosłowna kropka/\d\.\d/"v2.5" "2.5"
\\Dosłowny odwrotny ukośnik/\\/"C:\\dir" "\\"
\nWysuw wiersza/a\nb/"a\nb" "a\nb"
\tTabulator/a\tb/"a\tb" "a\tb"
\uFFFFZnak według jego punktu kodowego/\u00e9/"café" "é"

Flagi

6
FlagaNazwaZnaczenie
gGlobalnaZnajduje każde dopasowanie, nie tylko pierwsze.
iIgnorowanie wielkości literDopasowuje niezależnie od wielkości liter.
mWielowierszowaSprawia, że ^ i $ dopasowują się przy każdym złamaniu linii, a nie tylko na końcach ciągu.
sDot allPozwala, aby . dopasowywała także złamania linii.
uUnicodeTraktuje wzorzec jako punkty kodowe i włącza sekwencje escape właściwości \p{…}.
yStickyDopasowuje tylko dokładnie w pozycji lastIndex, nigdy nie szukając dalej.

Częste pytania

Jaka jest różnica między kwantyfikatorami zachłannymi a leniwymi?
Kwantyfikatory zachłanne (*, +, {2,}) dopasowują jak najwięcej i oddają znaki dopiero, gdy reszta wzorca nie może się dopasować. Dodanie ? czyni je leniwymi: dopasowują jak najmniej i biorą więcej tylko wtedy, gdy są do tego zmuszone. Dla „<a><b>” wzorzec <.+> zwraca cały ciąg, a <.+?> zwraca tylko <a>.
Dlaczego moje słowo dopasowuje się wewnątrz innych słów?
Bo nic go nie zakotwiczyło. Otocz słowo znakami \b — /\bcat\b/ dopasowuje „cat” w „the cat sat”, ale nie wewnątrz „concatenate”. \b dopasowuje pozycję między znakiem słowa a znakiem niebędącym słowem, więc niczego nie konsumuje.
Co zmienia flaga u?
Sprawia, że wzorzec operuje na punktach kodowych, a nie jednostkach UTF-16, więc pojedyncze emoji liczy się jako jeden znak, i włącza sekwencje escape właściwości \p{…}, takie jak \p{L} dla „dowolnej litery”. Bez niej \w i \d pozostają wyłącznie ASCII, dlatego „café” nie dopasowuje się w całości do /\w+/.
Kiedy używać grupy nieprzechwytującej?
Zawsze wtedy, gdy potrzebujesz grupowania, ale nie przechwyconego tekstu — (?:ab)+ zamiast (ab)+. Przechwytywanie kosztuje trochę wydajności, ale prawdziwym powodem jest numeracja: każda dodana grupa przechwytująca przesuwa numery tych, które są po niej, po cichu psując podstawienia korzystające z $1 i $2.
Czy lookbehind można bezpiecznie stosować?
W obecnych przeglądarkach i Node — tak; (?<=…) i (?<!…) są obsługiwane we wszystkich głównych silnikach od 2018 roku. Safari dodało to jako ostatnie. Jeśli celujesz w bardzo stare środowiska uruchomieniowe, sprawdź najpierw; dla składni regex nie ma polyfilla.