Preskočiť na obsah

Regexový ťahák

Regulárne výrazy sú dosť kompaktné na to, aby sa syntax ľahšie vyhľadala než zapamätala. Táto stránka je celá na jednej obrazovke — triedy, kvantifikátory, kotvy, skupiny, lookaround, escapovanie a príznaky — s funkčným príkladom pre každý riadok.

Variant je JavaScript, ktorý beží vo vašom prehliadači a ktorý používa aj regexový tester na tejto stránke. Väčšina je identická v Pythone, Jave, Go a PCRE; kde sa varianty líšia, líšia sa na okrajoch — podpora lookbehind, syntax pomenovaných skupín a to, či \d znamená „ASCII číslica“ alebo „ľubovoľná Unicode číslica“.

Za väčšinu prekvapení môžu dve veci. Kvantifikátory sú hltavé: berú všetko, čo môžu, a vracajú späť len vtedy, keď zvyšok vzoru zlyhá, a preto <.+> zhltne dve značky a <.+?> nie. A alternácia viaže najvoľnejšie zo všetkého, takže ^a|b$ znamená „začína na a, alebo končí na b“ — nie to, čo väčšina ľudí zamýšľa, keď to píše.

Znakové triedy

11

Skrátené zápisy sú iba ASCII, pokiaľ nepridáte príznak u a nepoužijete escapovanie Unicode vlastností.

SyntaxVýznamPríklad
.Ľubovoľný znak okrem zalomenia riadkaPridajte príznak s, aby sa zhodoval aj so znakmi nového riadka./a.c/"abc" "abc"
\dČíslica, 0–9/\d+/"order 42" "42"
\DČokoľvek, čo nie je číslica/\D+/"42abc" "abc"
\wPísmeno, číslica alebo podčiarkovníkIba ASCII — „é“ nie je \w./\w+/"user_1!" "user_1"
\WČokoľvek, s čím sa \w nezhoduje/\W+/"a++b" "++"
\sĽubovoľný biely znak vrátane tabulátorov a znakov nového riadka/\s+/"a \t b" " \t "
\SĽubovoľný znak, ktorý nie je biely/\S+/" hi" "hi"
[abc]Ktorýkoľvek z uvedených znakov/[aeiou]/"rhythm and" "a"
[^abc]Ľubovoľný znak okrem uvedených/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Rozsah znakov/[a-f]+/"zzabcz" "abc"
\p{L}Ľubovoľné Unicode písmeno (vyžaduje príznak u)/\p{L}+/"42 café" "café"

Kvantifikátory

7

Všetky sú predvolene hltavé: berú čo najviac a vracajú späť len vtedy, ak zvyšok vzoru zlyhá.

SyntaxVýznamPríklad
*Nula alebo viac/ab*/"a" "a"
+Jeden alebo viac/ab+/"abbb" "abbb"
?Nula alebo jeden — robí to voliteľným/colou?r/"color" "color"
{3}Presne tri/\d{3}/"id 12345" "123"
{2,}Dva alebo viac/a{2,}/"aaa" "aaa"
{2,4}Medzi dvoma a štyrmi/a{2,4}/"aaaaa" "aaaa"
*?Lenivý — berie čo najmenejHltavý <.+> by zhltol obe značky./<.+?>/"<a><b>" "<a>"

Kotvy a hranice

4

Zhodujú sa s pozíciou, nie so znakom, takže nič nekonzumujú.

SyntaxVýznamPríklad
^Začiatok reťazca, alebo riadka s príznakom m/^a/"abc" "a"
$Koniec reťazca, alebo riadka s príznakom m/c$/"abc" "c"
\bHranica slovaPráve toto zabráni, aby sa „cat“ zhodovalo vnútri „concatenate“./\bcat\b/"the cat sat" "cat"
\BNie je hranica slova/\Bcat/"concatenate" "cat"

Skupiny a alternácia

5
SyntaxVýznamPríklad
(abc)Zachytávajúca skupina — zapamätaná pre nahradenie/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Zoskupenie bez zachytávaniaPoužite to, keď potrebujete iba zoskupenie; zachová zmysluplnosť čísel zachytávaní./(?:ab)+/"abab" "abab"
(?<name>…)Pomenovaná zachytávajúca skupina/(?<year>\d{4})/"in 2026" "2026"
a|bKtorákoľvek strana — alternáciaAlternácia má najnižšiu prioritu: ^a|b$ je „^a“ alebo „b$“, nie „^(a|b)$“./cat|dog/"one dog" "dog"
\1Spätný odkaz na prvú skupinu/(\w)\1/"letter" "tt"

Lookaround

4

Tvrdenia o tom, čo obklopuje pozíciu. Samy sa s ničím nezhodujú, čo ich robí bezpečnými na kombinovanie.

SyntaxVýznamPríklad
(?=…)Lookahead — nasledované týmto/\d+(?= kg)/"80 kg" "80"
(?!…)Negatívny lookahead — nenasledované týmto/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — predchádzané týmto/(?<=\$)\d+/"costs $40" "40"
(?<!…)Negatívny lookbehind — nepredchádzané týmto/(?<!\$)\b\d+/"about 40" "40"

Escapovanie

5

Týchto dvanásť znakov potrebuje spätnú lomku, aby sa brali doslovne.

SyntaxVýznamPríklad
\.Doslovná bodka/\d\.\d/"v2.5" "2.5"
\\Doslovná spätná lomka/\\/"C:\\dir" "\\"
\nZnak nového riadka/a\nb/"a\nb" "a\nb"
\tTabulátor/a\tb/"a\tb" "a\tb"
\uFFFFZnak podľa jeho kódového bodu/\u00e9/"café" "é"

Príznaky

6
PríznakNázovVýznam
gGlobálnyNájde každú zhodu, nielen prvú.
iIgnorovať veľkosť písmenZhoduje sa bez ohľadu na veľké alebo malé písmená.
mViacriadkovýSpôsobí, že ^ a $ sa zhodujú pri každom zalomení riadka, nie len na koncoch reťazca.
sDot allUmožní, aby sa . zhodovala aj so zalomeniami riadka.
uUnicodeSpracúva vzor ako kódové body a povolí escapovanie vlastností \p{…}.
yStickyZhoduje sa iba presne na pozícii lastIndex, nikdy nehľadá dopredu.

Časté otázky

Aký je rozdiel medzi hltavými a lenivými kvantifikátormi?
Hltavé kvantifikátory (*, +, {2,}) zhodujú čo najviac a vracajú znaky späť len vtedy, keď sa zvyšok vzoru nedokáže zhodovať. Pridanie ? ich urobí lenivými: zhodujú čo najmenej a berú viac, len keď sú donútené. Na „<a><b>“ vzor <.+> vráti celý reťazec a <.+?> vráti len <a>.
Prečo sa moje slovo zhoduje vnútri iných slov?
Pretože ho nič neukotvilo. Obaľte slovo do \b — /\bcat\b/ sa zhoduje s „cat“ v „the cat sat“, no nie vnútri „concatenate“. \b sa zhoduje s pozíciou medzi slovným a neslovným znakom, takže nič nekonzumuje.
Čo mení príznak u?
Spôsobí, že vzor pracuje s kódovými bodmi namiesto UTF-16 jednotiek, takže jedno emoji sa počíta ako jeden znak, a povolí escapovanie vlastností \p{…}, ako je \p{L} pre „ľubovoľné písmeno“. Bez neho zostávajú \w a \d iba ASCII, a preto sa „café“ úplne nezhoduje s /\w+/.
Kedy mám použiť nezachytávajúcu skupinu?
Vždy, keď potrebujete zoskupenie, ale nie zachytený text — (?:ab)+ namiesto (ab)+. Zachytávania stoja trochu výkonu, no skutočným dôvodom je číslovanie: každá zachytávajúca skupina, ktorú pridáte, posunie čísla tých za ňou, čím nenápadne pokazí nahradenia, ktoré používajú $1 a $2.
Je bezpečné používať lookbehind?
V súčasných prehliadačoch a Node áno — (?<=…) a (?<!…) sú podporované vo všetkých hlavných engineoch od roku 2018. Safari ich pridalo ako posledné. Ak cielite na veľmi staré behové prostredia, najprv to overte; pre regexovú syntax neexistuje polyfill.