Hlavní navigace

Regulární výrazy (1)

Pavel Satrapa

Unix bez regulárních výrazů je jako sex bez partnera/partnerky. Dá se to používat, ale člověk o cosi zásadního přichází. Znalost regulárních výrazů vám dá do rukou mimořádně silný nástroj pro práci s textem.

Jejich prostřednictvím můžete:

  • vytahovat z textových dat údaje, které vás zajímají
  • přetvářet je do podoby, kterou potřebujete
  • vyhledávat a nahrazovat v textových editorech a dalších programech

Zkrátka regulární výraz je univerzální pomocník při práci s textem. Používá jej celá řada programů v Unixu. Umožňují prohledávat soubory (grep, egrep), editovat je (sed, vi), analyzovat a vypočítávát zajímavé údaje (awk) či nabízejí plnohodnotný programovací jazyk, kde si můžete dělat, co vás napadne (Perl, Tk). Ale nebudeme se dlouho zdržovat propagandou a vzhůru do díla.

Jednoduché výrazy

Nejjednodušším regulárním výrazem je obyčejné písmeno – třeba r. Když se v textu hledá řetězec, který by tomuto regulárnímu výrazu vyhověl, hledá se jednoduše písmeno „r“. Implicitně se (jak bývá v Unixu zvykem) rozlišují malá a velká písmena. Ve většině nástrojů však můžete tuto vlastnost vypnout.

Jelikož i v těch nejjednodušších případech člověk zpravidla hledá slovo a ne jediné písmeno, lze regulární výrazy řetězit. Použijete-li regulární výraz root, představuje vlastně zřetězení čtyř elementárních jednopísmenných regulárních výrazů. Výsledkem je chování, které byste očekávali – v textu se bude hledat slovo „root“.

Vyhledávání jednoduchých slov je tou nejprimitivnější, ale zároveň nejčastější aplikací regulárních výrazů.

Příklad:

Řekněme, že hledáte nejčerstvější soubory v aktuálním adresáři. Nevím jak vy, ale já v hlavě nenosím, jak se jmenuje volba příkazu ls, která zajistí uspořádání podle času. Takže zadám man ls a následně si pomocí /time nechám vyhledat první výskyt slova „time“. Nebudu-li spokojen, stisknu klávesu n a poskočím tak na další výskyt.

Popsané hledání založené na regulárních výrazech dovedou oba programy používané obvykle pro zobrazování manuálových stránek (a řady dalších textů): more i less. Tyto programy zároveň ilustrují jeden obecný princip: regulární výraz se typicky vyhledává jako podřetězec v jednotlivých řádcích textu.

Libovolný znak

Poměrně často dochází k situacím, kdy vám na určité části hledaného řetězce nezáleží. Například chcete ve zdrojovém textu HTML stránky vyhledávat začátky buněk v tabulkách – čili značky <TD> a <TH>. Až na třetí znak jsou oba řetězce shodné, takže je lze vyhledávat jediným regulárním výrazem. Pouze je třeba říci, že na jeho třetím znaku nezáleží.

Tuto činnost obstará znak tečka (.). Při hledání jí vyhoví libovolný znak kromě konce řádku. Nelze ji však ignorovat – nějaký znak jí program vždy musí přiřadit.

Příklad:

Výše zmíněné hledání řetězců „<TD>“ či „<TH>“ obstará regulární výraz <T.>. Přesněji řečeno mu vyhoví libovolný čtyřznakový řetězec, který začíná „<T“ a končí znakem „>“.

Ne až tak libovolný znak

Použitím tečky zcela rezignujete na hodnotu příslušného znaku. V některých případech se to hodí, jindy byste však potřebovali výběr omezit přísněji. Pak můžete sáhnout po hranatých závorkách.

Zapíšete-li do hranatých závorek skupinu znaků, bude tomuto regulárnímu výrazu vyhovovat právě jeden z těchto znaků. Například výrazu [xyz] vyhoví buď znak „x“ nebo „y“ nebo „z“. Jestliže povolené znaky tvoří interval, můžete si ušetřit práci a v hranatých závorkách uvést pouze jeho meze, které spojíte pomlčkou.

Příklad:

Pro vyhledání libovolné číslice poslouží regulární výraz [0–9]. Předchozí hledání <TD> a <TH> bylo příliš benevolentní, protože za T povolovalo libovolný znak. Lepší je regulární výraz <T[DH]>, který se skutečně omezí jen na uvedené dvě značky.

Jednotlivých znaků a jejich intervalů můžete do hranatých závorek napsat, co hrdlo ráčí. Například výrazu [a0–9zl-nt] vyhoví libovolné z písmen a, l, m, n, t, z nebo libovolná číslice.

Kromě pomlčky se v hranatých závorkách vyskytuje ještě jeden speciální znak. Pokud hned za otevírací hranatou závorkou zapíšete stříšku (^), bude celá skupina negována. To znamená, že regulárnímu výrazu vyhoví libovolný znak odlišný od těch, které jsou uvedeny ve skupině. Například [^0–9] vyhoví cokoli kromě číslice.

Intervaly znaků vycházejí z kódování ASCII. To znamená, že například výrazu [a-z] vyhoví libovolné malé písmeno anglické abecedy. Doplnit velká písmena není žádný velký problém ([a-zA-Z]), ale s českými znaky je potíž. V některých programech najdete konstrukce, kterým vyhoví i znaky české abecedy, univerzálně platné elegantní řešení však neexistuje.

Speciální znaky

Možná už vás napadlo „ale co když potřebuji vyhledat tečku?“ Tedy obecněji: jak vyřadit speciální význam některých znaků. Obecná odpověď na tuto otázku zní „zpětným lomítkem“. V Unixu bývá zvykem, že pokud speciálnímu znaku předřadíte zpětné lomítko, vypnete tak jeho speciální chování (a v některých případech právě naopak, jak uvidíte později).

Příklad:

Celkem pohledný regulární výraz \.\.\. hledá tři tečky. Chcete-li vyhledat písmeno uzavřené v hranatých závorkách (tedy cosi jako „[x]“), použijte \[[a-z]\].

Uvnitř hranatých závorek panuje specifické prostředí. Tečka zde představuje obyčejnou tečku a význam ostatních dvou speciálních znaků lze potlačit prostým pořadím. Stříška představuje negaci jen pokud je uvedena na samotném začátku a pomlčka slouží jako oddělovač intervalu jen pokud má z obou stran jeho meze. Takže například výrazu [.^az-] vyhoví pouze jeden ze znaků „.“, „^“, „-“, „a“ nebo „z“.

Pokud má být jedním z povolených znaků pravá hranatá závorka, uveďte ji hned za otevírací. Takže například regulárnímu výrazu [][] vyhoví levá nebo pravá hranatá závorka. Pokud byste znaky uvnitř vnějších hranatých závorek zapsali v opačném pořadí ([[]]), význam by se radikálně změnil: byl by interpretován jako [[] bezprostředně následované ]. Čili vyhověl by mu jedině řetězec „[]“.

Shrnutí

Tabulka č. 37
výraz vyhovuje
znak odpovídající znak
. libovolný znak
[znaky] jeden z uvedených znaků
[^znaky] libovolný znak kromě uvedených
\x vyřadí/zapne speciální význam znaku x
Našli jste v článku chybu?

30. 3. 2006 1:06

blox (neregistrovaný)
http://www.owebu.cz/programovani/vypis.php?clanek=822

20. 8. 2004 0:27

medhi (neregistrovaný)

nemohu pořád přijít na to, jak pomocí reg. v. vyjádřit "jakýkoli znak nebo žádný, ale nikoli znak x".
Pro lepší představu, potřebuji to k nahrazení nějakých slov, kromě těch, které jsou obklopeny uvozovkami.
Děkuji



Vitalia.cz: Vychytané vály a válečky na vánoční cukroví

Vychytané vály a válečky na vánoční cukroví

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Měšec.cz: Stavební spoření: alternativa i pro seniory

Stavební spoření: alternativa i pro seniory

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá