Tahák na regulární výrazy
Regulární výrazy jsou dostatečně úsporné na to, že se syntaxe snáze dohledá, než zapamatuje. Tato stránka je celá na jedné obrazovce — třídy, kvantifikátory, kotvy, skupiny, lookaround, escapování a příznaky — s funkčním příkladem pro každý řádek.
Použitým dialektem je JavaScript, který běží ve vašem prohlížeči a který používá tester regulárních výrazů na tomto webu. Většina toho je identická v Pythonu, Javě, Go a PCRE; kde se dialekty rozcházejí, rozcházejí se na okrajích — podpora lookbehind, syntaxe pojmenovaných skupin a to, zda \d znamená „ASCII číslice“, nebo „jakákoli číslice Unicode“.
Za většinu překvapení mohou dvě věci. Kvantifikátory jsou hladové: berou všechno, co mohou, a vracejí zpět jen tehdy, když zbytek vzoru selže, což je důvod, proč <.+> spolkne dvě značky a <.+?> ne. A alternace váže ze všeho nejvolněji, takže ^a|b$ znamená „začíná na a, nebo končí na b“ — ne to, co většina lidí zamýšlí, když to napíše.
Třídy znaků
11Zkratky jsou pouze ASCII, pokud nepřidáte příznak u a nepoužijete escape sekvence vlastností Unicode.
| Syntaxe | Význam | Příklad |
|---|---|---|
| . | Jakýkoli znak kromě zalomení řádkuPřidejte příznak s, aby odpovídal i novým řádkům. | /a.c/"abc" → "abc" |
| \d | Číslice, 0–9 | /\d+/"order 42" → "42" |
| \D | Cokoli, co není číslice | /\D+/"42abc" → "abc" |
| \w | Písmeno, číslice nebo podtržítkoPouze ASCII — „é“ není \w. | /\w+/"user_1!" → "user_1" |
| \W | Cokoli, čemu \w neodpovídá | /\W+/"a++b" → "++" |
| \s | Jakýkoli bílý znak, včetně tabulátorů a nových řádků | /\s+/"a \t b" → " \t " |
| \S | Jakýkoli znak, který není bílý | /\S+/" hi" → "hi" |
| [abc] | Kterýkoli z uvedených znaků | /[aeiou]/"rhythm and" → "a" |
| [^abc] | Jakýkoli znak kromě uvedených | /[^aeiou ]+/"aeiou xyz" → "xyz" |
| [a-z] | Rozsah znaků | /[a-f]+/"zzabcz" → "abc" |
| \p{L} | Jakékoli písmeno Unicode (vyžaduje příznak u) | /\p{L}+/"42 café" → "café" |
Kvantifikátory
7Všechny jsou ve výchozím stavu hladové: berou co nejvíce a vracejí zpět jen tehdy, když zbytek vzoru selže.
| Syntaxe | Význam | Příklad |
|---|---|---|
| * | Nula nebo více | /ab*/"a" → "a" |
| + | Jeden nebo více | /ab+/"abbb" → "abbb" |
| ? | Nula nebo jeden — činí to nepovinným | /colou?r/"color" → "color" |
| {3} | Přesně tři | /\d{3}/"id 12345" → "123" |
| {2,} | Dva nebo více | /a{2,}/"aaa" → "aaa" |
| {2,4} | Mezi dvěma a čtyřmi | /a{2,4}/"aaaaa" → "aaaa" |
| *? | Líný — shodí co nejméněHladový <.+> by spolkl obě značky. | /<.+?>/"<a><b>" → "<a>" |
Kotvy a hranice
4Odpovídají pozici, nikoli znaku, takže nespotřebují nic.
| Syntaxe | Význam | Příklad |
|---|---|---|
| ^ | Začátek řetězce, nebo řádku s příznakem m | /^a/"abc" → "a" |
| $ | Konec řetězce, nebo řádku s příznakem m | /c$/"abc" → "c" |
| \b | Hranice slovaTo je to, co zabrání, aby „cat“ odpovídalo uvnitř „concatenate“. | /\bcat\b/"the cat sat" → "cat" |
| \B | Ne hranice slova | /\Bcat/"concatenate" → "cat" |
Skupiny a alternace
5| Syntaxe | Význam | Příklad |
|---|---|---|
| (abc) | Zachytávající skupina — zapamatována pro náhradu | /(\d+)-(\d+)/"10-20" → "10-20" |
| (?:abc) | Seskupení bez zachyceníPoužijte to, když potřebujete jen seskupení; zachovává to smysluplnost čísel zachycení. | /(?:ab)+/"abab" → "abab" |
| (?<name>…) | Pojmenovaná zachytávající skupina | /(?<year>\d{4})/"in 2026" → "2026" |
| a|b | Kterákoli strana — alternaceAlternace má nejnižší prioritu: ^a|b$ je „^a“ nebo „b$“, nikoli „^(a|b)$“. | /cat|dog/"one dog" → "dog" |
| \1 | Zpětný odkaz na první skupinu | /(\w)\1/"letter" → "tt" |
Lookaround
4Tvrzení o tom, co pozici obklopuje. Sama neodpovídají ničemu, což je činí bezpečnými pro kombinování.
| Syntaxe | Význam | Příklad |
|---|---|---|
| (?=…) | Lookahead — následováno tímto | /\d+(?= kg)/"80 kg" → "80" |
| (?!…) | Negativní lookahead — nenásledováno tímto | /\d+(?! kg)/"80 lb" → "80" |
| (?<=…) | Lookbehind — předcházeno tímto | /(?<=\$)\d+/"costs $40" → "40" |
| (?<!…) | Negativní lookbehind — nepředcházeno tímto | /(?<!\$)\b\d+/"about 40" → "40" |
Escapování
5Těchto dvanáct znaků je těch, které potřebují zpětné lomítko, aby byly brány doslovně.
| Syntaxe | Význam | Příklad |
|---|---|---|
| \. | Doslovná tečka | /\d\.\d/"v2.5" → "2.5" |
| \\ | Doslovné zpětné lomítko | /\\/"C:\\dir" → "\\" |
| \n | Line feed | /a\nb/"a\nb" → "a\nb" |
| \t | Tabulátor | /a\tb/"a\tb" → "a\tb" |
| \uFFFF | Znak podle jeho kódového bodu | /\u00e9/"café" → "é" |
Příznaky
6| Příznak | Název | Význam |
|---|---|---|
| g | Global | Najde každou shodu, nejen první. |
| i | Ignorovat velikost písmen | Odpovídá bez ohledu na velká či malá písmena. |
| m | Multiline | Způsobí, že ^ a $ odpovídají na každém zalomení řádku místo jen na koncích řetězce. |
| s | Dot all | Umožní, aby . odpovídalo i zalomením řádku. |
| u | Unicode | Zachází se vzorem jako s kódovými body a povoluje escape sekvence vlastností \p{…}. |
| y | Sticky | Odpovídá pouze přesně na lastIndex, nikdy nehledá dopředu. |