„Regulární výrazy“ (RE = Regular Expressions = regex) jsou výrazy (řetězce), které definují celou množinu odpovídajících řetězců. Pomocí znaků a konstrukcí se speciálním významem můžeme popsat, jak by měly vypadat řetězce podle naší představy. Napříkad slovo obsahující právě jedno velké písmeno, nebo řádek končící číslem.
Použití RE je především při zpracování textů a dat. Je tak běžnou součástí jak textových editorů a filtrů/nástrojů, tak i knihoven a (programovacích) jazyků. Takže jejich uplatnění je široké a užitečné a proto se vyplatí se naučit je používat.
Na toto téma jsem nahrál několik videí v rámci seriálů „Programování v shellu“ (PS) a „Shellu prakticky“ (SP) nebo příspěvků na konferencích (InstallFest).
- PS: Regulární výrazy - grep, egrep, fgrep
- PS: Regulární výrazy - Atomické výrazy a kotvy
- PS: Regulární výrazy - Kvantifikátory
- PS: Regulární výrazy - Podvýrazy a speciální znaky
- PS: Regulární výrazy - Syntaxe
- SP: Regulární výrazy při zpracování logů
- InstallFest: bash a zpracování textů
- InstallFest: bash a regulární výrazy VS shellovské vzory
Tahák pro RE [formát SVG]: A4 barevně, A5 barevně, A4 černobíle, A5 černobíle
Regulární výrazy se skládají z atomů, což může být buď konkrétní znak, jeden znak z množiny nebo libovolný znak, případně skupina uzavřená v závorkách. Atomy se skládají rovnou za sebe jako písmena ve slově. Atomy je možné opakovat pomocí kvantifikátorů. Text odpovídající RE se hledá kdekoliv na řádce, ale je možné jej pomocí kotev ukotvit k začátku nebo konci řádky nebo slova.
Základní (BRE) a rozšířené regulární výrazy (ERE)
Původně uměly nástroje pro práci s regulárními výrazy menší sadu speciálních znaků,
které nereprezentují samy sebe (doslovně), ale znamenají nějakou konstrukci v RE.
Např. [
a ]
, zapisující množinu znaků nebo *
pro libovolné opakování, nebo
kotvy ^
a $
.
Později se skupina speciálních konstrujcí rozrůstala pomoužitím
speciálního znaku \
, který umožňuje nejenom rušit, ale také přidávat, speciální
význam. Např. \(
a \)
pro označení podvýrazu, nebo \{
a \}
pro určení
počtu opakování.
Znaky \
však dělaly RE hůř čitelné a proto vznikly rozšířené regulární výrazy,
které od začátku závorky definovaly jako speciální znaky a k nim přidaly ještě
řadu dalších možností. Např. |
pro zápis variant řetězců nebo zpětné odkazy
na podvýrazy.
Rozšířené regulární výrazy (ERE) tedy jak rozšířují základní regulární výrazy (BRE), tak je také zjednodušují (zpřehledňují). Různé nástroje pro práci s RE podporují různou podmnožinu regulárních výrazů a některé (např. Perl) ji dokonce ješte výrazně rozšiřují.
Rozdíly mezi různými verzemi (grep/sed/awk/vim)
Existuje obrovské množství programů a prostředí, které podporují regulární výrazy v nějaké podobě (podmnožině). Různé programy nebo dokonce jejich verze navíc mají různou syntaxi. Je dobré se s tím smířit a nespoléhat na to, že syntaxe, kterou umíte, bude fungovat vždy a všude.
Tahák pro podporu RE v různých programech [formát SVG]: A4 barevně, A5 barevně, A4 černobíle, A5 černobíle
Obecně se dají případy rozdělit na použití základních (BRE) a rozšířených (ERE)
regulárních výrazů. Typicky tedy příkazy grep
(BRE) a egrep
(ERE). GNU verze
příkazů mají často přepínač, kterým je možné změnit typ regulárních výrazů, např.
grep -E
nebo sed -r
pro ERE.
Naštěstí princip RE je všude stejný a pokud se nepohybujete napříč různými systémy a programy nebo jejich verzemi, naučíte se tu variantu, která vám vyhovuje a vaše programy umí a s dál si s tím hlavu nelámete (pokud nemusíte). V takovém případě doporučuji GNU nástroje a rozšířené regulární výrazy (ERE), které podporuje i bash (Video: bash a regulární výrazy VS shellovské vzory).