Obcování s ďáblem 18: Speciální regulární výrazy - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se narodil známý fotograf František Drtikol?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Informace

Obcování s ďáblem 18: Speciální regulární výrazy

22. listopadu 2001, 00.00 | Minule jsme se seznámili se základními regulárními výrazy, dnes si ukážeme několik speciálních regulárních výrazů:

Minule jsme se seznámili se základními regulárními výrazy, jež umožňují specifikovat požadovaný znak: vlastně šlo jen o tři možnosti:

  • obyčejný znak, který representuje sám sebe;
  • seznam přípustných znaků v hranatých závorkách;
  • tečka, která representuje jakýkoli znak.

Dnes si ukážeme několik speciálních regulárních výrazů:

Začátek a konec řádku

Vzhledem k tomu, že je často důležité rozlišit, zda je hledaný textový řetězec na okraji řádku nebo uvnitř, nabízejí regulární výrazy dva speciální znaky:

  • regulární výraz "^" odpovídá začátku řádku;
  • regulární výraz "$" odpovídá konci řádku.

Samy o sobě samozřejmě tyto výrazy nemají žádný smysl; skvěle však slouží ve spojení s ostatními: zatímco regulární výraz "ahoj" odpovídá textovému řetězci "ahoj" kdekoli na řádku, výraz "^ahoj" odpovídá témuž řetězci jen pokud je na začátku řádku, a regulární výraz "^ahoj$" požaduje řádek, na kterém není nic jiného, než slovo "ahoj".

Není řádek jako řádek!

Vzhledem k tomu, že jsme zde vlastně na práci s řádky narazili prvně, stojí za to upozornit na jeden potenciální podraz: pozor na aplikace z prostředí Classic, a pozor na soubory z prostředí DOSu nebo windoze! Oddělovač řádků totiž (ve znakové sadě ASCII, kterou dnes používají všechny běžné mikropočítače) je znak LF ("Line Feed", tj. "přechod na další řádek"), který má kód 10 (0Ah). Ten také všechny standardní příkazy očekávají a korektně interpretují.

Bohužel, jinde je tomu jinak. MS DOS a Windows se dodnes chovají tak, jako by jejich uživatelé namísto klávesnice a obrazovky používali elektrické psací stroje (jejichž prostřednictvím se skutečně před několika desítkami let s počítači komunikovalo): ke znaku LF přidávají ještě naprosto zbytečný znak CR ("carriage return") s kódem 13 (0Dh), který na elektrickém psacím stroji zajistil, aby se tisková hlava před přechodem na další řádek posunula doleva, zpět na začátek řádku. V unixových systémech (mezi které patří i OS X) nám pak CR zůstane na konci každého řádku jako jeden neviditelný znak navíc, se kterým musíme počítat.

V Classicu je to ještě horší: jeho tvůrci si sice správně uvědomili, že dvojice znaků CR,LF ztratila s odchodem elektrických psacích strojů jakýkoli smysl; z nějakého záhadného důvodu si však pro oddělování řádků z nich vybrali ten, který ve skutečnosti nic neodděluje — CR! Celý textový soubor z "classické" aplikace (třeba ze Zápisníku) je proto pro jakýkoli standardní příkaz prostě jedním jediným dlouhatánským řádkem.

Jak tento problém korektně vyřešit si ukážeme později, až se budeme bavit o příkazech tr a sed; prozatím se spokojíme s tím, že se při práci s texty dělenými do řádků budeme nekorektním souborům z Classica nebo windoze vyhýbat.

Výrazy související se slovy

Snad ještě častější než práce s řádky je při zpracování textů práce se slovy. Ačkoli bychom si mohli do značné míry práci se slovy "sestavit" sami s využítím regulárních výrazů typu "[[:alnum:]]", dalo by to spoustu práce, a výsledné regulární výrazy by byly špatně čitelné. Máme proto k dispozici několik speciálních služeb a zkratek:

  • regulární výraz "\w" je zkratka, ekvivalentní výrazu "[[:alnum:]]"; podobně "\W" je zkratka, ekvivalentní regulárnímu výrazu "[^[:alnum:]]";
  • regulární výraz "\b" odpovídá prázdnému řetězci na okraji slova;
  • regulární výraz "\B" odpovídá prázdnému řetězci, který není na okraji slova;
  • regulární výrazy "\<" a ">" odpovídají prázdnému řetězci na začátku a na konci slova.

Možná stojí za zmínku si ujasnit, co to znamená, že "regulární výraz odpovídá prázdnému řetězci": jde o to, že použití takového výrazu může omezit textové řetězce, které výrazu odpovídají. Mezi každými dvěma znaky (a před prvním a za posledním) si samozřejmě vždy můžeme představit prázdný řetězec; podle konkrétního umístění a obsahu daných dvou znaků však tento prázdný řetězec bude nebo nebude stát mezi slovy a podobně.

Například regulární výraz ".." odpovídá naprosto libovolné dvojici znaků. Regulární výraz ".\<." však odpovídá jen a jenom takové dvojici znaků, z nichž první je poslední oddělovač před začátkem slova, a druhý je prvním znakem slova. Regulární výraz ".>." už jistě nemusíme vysvětlovat... a pokud bychom chtěli najít jak řetězce, jež odpovídají výrazu ".\<.", tak i řetězce, jež odpovídají výrazu ".>.", můžeme použít výraz ".\b.": tomu odpovídá libovolná dvojice znaků, z nichž jeden (kterýkoli) je oddělovačem, a druhý součástí některého slova. Konečně, co výraz ".\B."? Je vám jasné, čemu bude odpovídat?

Příště...

...si zopakujeme čemu (a proč) odpovídá regulární výraz ".\B.". Kromě toho a především se naučíme regulární výrazy skládat dohromady a kombinovat jejich služby.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy a Triky  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: