Regulární výrazy mají pověst vypadajících jako náhodný šum. Vzor jako ^[\w.-]+@[\w-]+\.\w{2,}$ může vypadat, jako by kočka přešla po klávesnici. Ale za záhadnou syntaxí se skrývá pozoruhodně elegantní myšlenka: stručný jazyk pro popis vzorů v textu.
Ať už validujete formulářové vstupy, prohledáváte log soubory, čistíte data nebo provádíte najdi-a-nahraď v celém kódu, regex je jedním z nejvšestrannějších nástrojů v sadě vývojáře. A nemusíte si pamatovat každou obskurní funkci, abyste z něj získali reálnou hodnotu. Hrstka stavebních bloků pokrývá naprostou většinu praktických použití.
Co regex vlastně dělá
Regulární výraz (regex nebo regexp) je vzor, který popisuje množinu řetězců. Předáte ho vyhledávacímu engine — ve vašem programovacím jazyku, textovém editoru nebo nástroji příkazové řádky — a ten najde každý řetězec, který odpovídá.
Představte si ho jako vylepšený vyhledávací dotaz:
- Normální vyhledávání: najdi přesné slovo „error"
- Vyhledávání regexem: najdi cokoli, co vypadá jako IP adresa, datum, e-mailová adresa nebo jakákoli struktura, kterou dokážete popsat
Regex vynalezl matematik Stephen Kleene v roce 1956 a do informatiky vstoupil přes textové editory Unixu v 60. letech. Dnes je podporován prakticky v každém programovacím jazyku a textovém editoru.
Stavební bloky
Literální znaky
Nejjednodušší regex je prostý text. Vzor hello odpovídá řetězci „hello" kdekoliv se objeví. Nic složitého.
Tečka (.) — jakýkoli znak
Tečka odpovídá jakémukoli jednotlivému znaku kromě znaku nového řádku.
h.todpovídá „hat", „hit", „hot", „h3t" a dokonce „h t"
Třídy znaků ([])
Hranaté závorky definují množinu povolených znaků na jedné pozici.
[aeiou]— jakákoli samohláska[0-9]— jakákoli číslice[A-Za-z]— jakékoli písmeno[^0-9]— jakýkoli znak, který NENÍ číslice (^uvnitř závorek znamená „ne")
Zkratkové třídy
| Zkratka | Význam | Ekvivalent |
|---|---|---|
\d |
Jakákoli číslice | [0-9] |
\w |
Slovní znak | [A-Za-z0-9_] |
\s |
Bílý znak | [ \t\n\r] |
\D |
Ne číslice | [^0-9] |
\W |
Ne slovní znak | [^A-Za-z0-9_] |
\S |
Ne bílý znak | [^ \t\n\r] |
Kvantifikátory — kolikrát
Kvantifikátory řídí, kolikrát se musí předcházející element objevit.
| Symbol | Význam | Příklad | Odpovídá |
|---|---|---|---|
* |
Nula nebo více | ab*c |
„ac", „abc", „abbc" |
+ |
Jeden nebo více | ab+c |
„abc", „abbc" (ne „ac") |
? |
Nula nebo jeden | colou?r |
„color" a „colour" |
{3} |
Přesně 3 | \d{3} |
„123", „456" |
{2,4} |
Mezi 2 a 4 | \d{2,4} |
„12", „123", „1234" |
Kotvy — pozice
^— začátek řetězce (nebo řádku, s příznakemm)$— konec řetězce (nebo řádku)\b— hranice slova
Vzor ^\d{4}$ odpovídá řetězci, který je přesně čtyři číslice, jako „2026", ale ne „abc2026" nebo „2026xyz".
Skupiny a alternace
(abc)— zachytí „abc" jako skupinua|b— odpovídá „a" nebo „b"(cat|dog)— odpovídá „cat" nebo „dog"
Skupiny také umožňují aplikovat kvantifikátory na sekvence: (ha)+ odpovídá „ha", „haha", „hahaha".
Běžné praktické vzory
Validace e-mailu (základní)
^[\w.-]+@[\w-]+\.\w{2,}$
Toto odpovídá user@example.com, first.last@company.co.uk (částečně) a odmítá řetězce bez @ nebo domény.
Důležité: Dokonalá validace e-mailových adres pomocí regex je notoricky obtížná — plná specifikace RFC 5322 je extrémně složitá. Pro produkční systémy použijte základní regex pro kontrolu formátu a pak adresu ověřte odesláním potvrzovacího e-mailu.
Shoda telefonního čísla
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Toto zvládá formáty jako +1 555 123 4567, 555-123-4567 a (555) 123-4567.
Shoda URL
https?://[\w.-]+(/[\w./?&=-]*)?
Odpovídá https://example.com, http://example.com/path?q=hello.
Shoda data (RRRR-MM-DD)
\d{4}-\d{2}-\d{2}
Odpovídá 2026-03-29, 1999-12-31. Poznámka: toto kontroluje pouze formát, ne platnost — odpovídalo by i 9999-99-99.
Příznaky měnící chování
Většina regex engine podporuje příznaky, které mění způsob aplikace vzoru:
| Příznak | Název | Efekt |
|---|---|---|
g |
Globální | Najdi všechny shody, nejen první |
i |
Bez rozlišení velkých/malých | hello odpovídá „Hello", „HELLO" atd. |
m |
Víceřádkový | ^ a $ odpovídají začátku/konci každého řádku |
s |
Dotall | . odpovídá i znakům nového řádku |
V JavaScriptu se příznaky připojují za uzavírací lomítko: /hello/gi. V Pythonu se předávají jako argumenty: re.findall(r"hello", text, re.IGNORECASE).
Kdy je regex přehnaný
Regex je mocný, ale není vždy správným nástrojem:
- Parsování HTML nebo XML. Použijte správný DOM parser. Regex nedokáže spolehlivě zpracovat vnořené tagy.
- Parsování JSON. Použijte
JSON.parse()nebo ekvivalent. Regex selže na hraničních případech. - Složitá validace. Pokud váš vzor zabírá více řádků a jeho čtení trvá pět minut, zvažte napsání procedurálního validačního kódu.
- Jednoduché řetězcové operace. Pokud potřebujete jen
startsWith(),includes()nebosplit(), běžné řetězcové metody jsou jasnější a rychlejší.
Běžná úskalí
- Zapomenutí escapovat speciální znaky. Tečka
.odpovídá jakémukoli znaku. Pro shodu s doslovnou tečkou použijte\.. Totéž pro(,),[,],+,*,?,{,},^,$,|a\. - Hladové vs líné shody. Ve výchozím nastavení je
.*hladové — odpovídá co nejvíce. Přidejte?pro líné:.*?odpovídá co nejméně. To je důležité při extrakci obsahu mezi oddělovači. - Katastrofální backtracking. Vnořené kvantifikátory jako
(a+)+mohou způsobit, že engine zkouší exponenciální počet cest na určitých vstupech, čímž zamrzne váš program. Vyhněte se vnořenému opakování na překrývajících se vzorech. - Zapomenutí kotvení. Bez
^a$váš vzor odpovídá podřetězcům.\d{3}odpovídá „123" uvnitř „abc12345". Použijte^\d{3}$, pokud potřebujete přesnou shodu.
Další informace
Nejlepší způsob, jak se naučit regex, je experimentovat. Napište vzor, vložte testovací text a sledujte, co se zvýrazní. Upravujte a opakujte, dokud nepochopíte, jak každý dílek funguje.
- Jak testovat vzory regex — interaktivní tutoriál s příklady
- Tester regex — vložte svůj vzor a testovací data, sledujte shody zvýrazněné v reálném čase
