Regulární výrazy pro lidi: Praktický průvodce
Regulární výrazy (regex) mají špatnou pověst. Vypadají, jako by někdo usnul na klávesnici: ^[\w.-]+@[\w-]+\.[\w.]+$. Objevují se v revizích kódu, textových editorech, vyhledávacích nástrojích a při validaci formulářů. Vývojáři je buď milují, nebo se jim úplně vyhýbají.
Pravda je někde uprostřed. Regex je skutečně mocný. A zároveň je zpočátku skutečně matoucí. Ale k získání praktické hodnoty nepotřebujete ovládat každou obscurní funkci. Hrstka vzorů pokrývá naprostou většinu reálných případů použití.
Co regex vlastně dělá
Regulární výraz je vzor, který popisuje sadu řetězců. Předáte ho vyhledávacímu nástroji a ten najde každý řetězec odpovídající vzoru. Přemýšlejte o tom jako o velmi přesném vyhledávacím dotazu.
Běžné vyhledávání: najdi přesně „ahoj" Vyhledávání regexem: najdi cokoli, co vypadá jako e-mailová adresa, telefonní číslo, datum, URL nebo jakýkoli jiný popis vzoru.
Věděli jste? Regulární výrazy vynalezl matematik Stephen Kleene v roce 1956 jako zápis pro popis „regulárních jazyků" v teorii formálních jazyků. Do výpočetní techniky se dostaly prostřednictvím raných unixových textových editorů v 60. a 70. letech.
Stavební kameny
Doslovné znaky
Nejjednodušší regex je jen doslovný text. Vzor ahoj odpovídá řetězci „ahoj." Nic složitého.
Tečka (.) — Jakýkoli jeden znak
Tečka odpovídá jakémukoli jednomu znaku (kromě nového řádku).
h.todpovídá „hat," „hit," „hot," „hut" a dokonce „h3t"
Třídy znaků ([]) — Specifické znaky
Hranaté závorky definují sadu povolených znaků na dané pozici.
[aeiou]odpovídá jakékoli samohlásce[0-9]odpovídá jakékoli číslici[A-Za-z]odpovídá jakémukoli písmenu (velké nebo malé)[^0-9]odpovídá jakémukoli znaku, který NENÍ číslicí (^uvnitř závorek znamená „ne")
Kvantifikátory — Kolik
Tyto symboly řídí opakování:
| Symbol | Význam | Příklad | Odpovídá |
|---|---|---|---|
* |
Nula nebo více | ab*c |
„ac," „abc," „abbc," „abbbc" |
+ |
Jeden nebo více | ab+c |
„abc," „abbc," „abbbc" (nikoli „ac") |
? |
Nula nebo jeden | colou?r |
„color" a „colour" |
{3} |
Přesně 3 | a{3} |
„aaa" |
{2,4} |
Mezi 2 a 4 | a{2,4} |
„aa," „aaa," „aaaa" |
Kotvy — Pozice
^na začátku znamená „začátek řetězce"$na konci znamená „konec řetězce"^ahoj$odpovídá pouze přesnému řetězci „ahoj," nikoli „řekni ahoj" nebo „ahoj světe"
Zkratkové třídy
Běžné třídy znaků mají zkratky:
| Zkratka | Ekvivalent | Význam |
|---|---|---|
\d |
[0-9] |
Jakákoli číslice |
\w |
[A-Za-z0-9_] |
Jakýkoli „slovní" znak |
\s |
[ \t\n\r] |
Jakékoli bílé místo |
\D |
[^0-9] |
Jakýkoli nečíselný znak |
\W |
[^A-Za-z0-9_] |
Jakýkoli neslovní znak |
\S |
[^ \t\n\r] |
Jakýkoli znak bez bílého místa |
Skupiny (()) — Seskupování a zachytávání
Závorky seskupují části vzoru. To je užitečné pro aplikování kvantifikátorů na skupinu nebo pro extrakci konkrétních částí shody.
(ab)+odpovídá „ab," „abab," „ababab"(\d{3})-(\d{4})odpovídá „555-1234" a zachytí „555" a „1234" samostatně
Svislice (|) — Nebo
Svislice znamená „nebo."
kočka|pesodpovídá „kočka" nebo „pes"(jpg|png|gif)odpovídá kterékoli z těchto tří přípon obrázků
Praktické vzory k okamžitému použití
Shoda s e-mailovou adresou (jednoduše)
[\w.-]+@[\w-]+\.[\w.]+
Rozbor:
[\w.-]+— jeden nebo více slovních znaků, teček nebo pomlček (lokální část)@— doslovný znak @[\w-]+— jeden nebo více slovních znaků nebo pomlček (doména)\.— doslovná tečka (escapovaná, protože.je speciální znak)[\w.]+— jeden nebo více slovních znaků nebo teček (TLD)
Varování Validace e-mailu pomocí regexu je notoricky obtížná. Jednoduchý vzor výše pokrývá 99 % reálných e-mailových adres, ale nezvládá každý okrajový případ definovaný ve specifikaci RFC. Pro produkční validaci používejte knihovnu pro validaci e-mailu vašeho programovacího jazyka.
Shoda s telefonním číslem (formát ČR)
(\+420\s?)?(\d{3}\s?){3}
Toto odpovídá:
- +420 777 123 456
- 777123456
- 777 123 456
Shoda s URL
https?://[\w.-]+(/[\w./-]*)?
Toto odpovídá:
Shoda s datem (RRRR-MM-DD)
\d{4}-\d{2}-\d{2}
Toto odpovídá: 2026-03-23, 1999-12-31 atd.
Nalezení duplicitních slov
\b(\w+)\s+\1\b
Toto odpovídá opakovaným slovům jako „the the" nebo „is is." \1 odkazuje na to, co bylo zachyceno první skupinou.
Shoda s IPv4 adresou
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Toto odpovídá vzorům jako 192.168.1.1 nebo 10.0.0.255.
Tipy pro psaní regexu
1. Začněte jednoduše, pak zpřesňujte
Nesnažte se napsat dokonalý regex napoprvé. Začněte s obecným vzorem, otestujte ho na svých datech a zpřesňujte ho.
2. Vždy testujte
Regex se snadno napíše špatně. Chybějící kvantifikátor nebo neescapovaná tečka mohou úplně změnit, co se shoduje. Vždy testujte svůj vzor na reálných datech před použitím v produkci.
3. Escapujte speciální znaky
Pokud potřebujete shodu s doslovnou tečkou, závorkou, hranatou závorkou nebo jiným speciálním znakem, escapujte ho zpětným lomítkem: \., \(, \[.
4. Používejte komentáře a pojmenované skupiny
U složitých vzorů používejte pojmenované skupiny a komentáře (tam, kde je to podporováno), aby byl regex čitelný. Vaše budoucí já vám poděkuje.
5. Vězte, kdy regex nepoužít
Regex je špatný nástroj pro parsování HTML, XML, JSON nebo jakékoli vnořené struktury. Pro ty použijte správný parser.
Tip Testujte a ladíte vzory regexu v reálném čase: Jak testovat vzory regexu. Vložte svůj vzor a testovací data a okamžitě uvidíte zvýrazněné shody.
Začněte testovat regex hned teď:
Zdarma, okamžitá zpětná vazba a bez nutnosti registrace.