Mobilchange news Obsah dokumentace Uživatelská dokumentace Administrátorská dokumentace Rejstřík pojmů Technická podpora Hledání on-line

Úvod do regulárních výrazů

Stručný úvod do regulárních výrazů se zvláštním přihlédnutím k jejich aplikaci v prostředí systému MobilChange. MobilChange používá regulární výrazy na mnoha místech, například v konfiguraci routingu odchozích i příchozích zpráv. Tento dokument vysvětluje základy používání regulárních výrazů.


Úvod - co jsou to regulární výrazy?

Regulární výraz (dále jen regexp, z angl. Regular Expression) je rozšířením klasické "hvězdičkové konvence" z MS DOSu. Umožňuje zadat podstatně složitější výraz a hlavně najít jeho části a ty pak použít v dalším zpracování.

zpět na začátek


Speciální znaky

V klasickém MS DOSu jsou při používání hvězdičkové konvence definovány dva speciální znaky: hvězdička (libovolný počet libovolných znaků) a otazník (jeden libovolný znak). V regexpu je podobných znaků víc:
. - tečka
Tečka zastupuje jeden libovolný znak. Stejná funkce jako DOSový otazník.
* - hvězdička
Libovolný (i nulový) počet opakování předešlého znaku (nebo skupiny znaků). Ekvivalent dosové hvězdičky by se tedy napsal jako .* (libovolný počet opakování libovolného znaku).
+ - plus
Libovolný nenulový počet opakování předešlého znaku (nebo skupiny znaků). Tj. chová se jako hvězdička, ale hledaný znak/sekvence znaků se musí vyskytnout alespoň jednou.
? - otazník
Předchozí znak (či skupina znaků) je volitelný -- může ale nemusí se vyskytnout.
AHOJ? bude splněno na slovech AHOJ i AHO.
[] - hranaté závorky
Hranaté závorky ohraničují složitější definici jednoho znaku. Do nich se zapíše, které znaky jsou na dané pozici povoleny, a to buď výčtem, nebo intervalem:
[123] povoluje na dané pozici jednu z číslic 1, 2 nebo 3
[2-6] povoluje na dané pozici jednu z číslic 2 až 6
V jedněch závorkách může být několik podmínek, tj.
[2-6ABCG-L] povoluje na této pozici číslice 2 až 6 nebo jedno z písmen A B C G H I K L
^ - stříška
Stříška má dva různé významy. Na začátku regexpu značí, že se regexp musí "trefit" hned od začátku testovaného výrazu (jinak je platný, i když najde výskyt třeba až uprostřed). V hranatých závorkách pak značí, že následující znak se na dané pozici nesmí objevit. Regexp [^a] tedy říká, že na dané pozici může být libovolný znak kromě "a".
$ - dolar
Dolar na konci regexpu je podobný jako stříška na jeho začátku -- říká, že regexp se musí rozvinout až do konce testovaného textu.
() - kulaté závorky
Kulaté závorky ohraničují "podvýraz". Ten je jednak použitelný v dalším zpracování (například zde) a druhak je jej možno použít ke složitějšímu hledání:
bana(na)* odpovídá slovům bana, banana, bananana, banananana atd.

zpět na začátek


Jak hledat speciální znaky?

Pokud se v regexpu mají hledat speciální znaky, stačí je uvést prefixem \ (zpětné lomítko). V hranatých závorkách jako speciální znak funguje jen ^ a -, všechny ostatní není třeba uvádět \.

zpět na začátek


Složitější výrazy

Všechny výše uvedené regexpy se dají zkompletovat do složitějších výrazů. Zde je několik ukázek:
^#pizza (.*)$
Tento regexp bude platný pro všechny texty začínající textem #pizza následovaným jednou mezerou. Všechny následující znaky až do konce výrazu jsou uloženy v podvýrazu číslo 1, který je možno použít v dalším zpracování.
^#([^ ]+) (.*)$
Tento regexp bude platný pro všechny texty začínající textem znakem #, za kteým následuje libovolná sekvence znaků, jedna mezera a další libovolná sekvence znaků. Přičemž výsledek podvýrazu [^ ]+ (sekvence libovolných znaků až do mezery) bude uložen jako podvýraz číslo 1, druhý podvýraz .* (sekvence libovolných znaků) bude uložen jako podvýraz 2.
^42060[34][0-9]+,^4616$
Toto najde všechny čísla sítě T-mobile CZ:420603xxxxxx, 420604ccccccc, 4616. Nenajde však čísla 420602zzzzzzz (dvojka na šestém místě nevyhovuje výrazu [34]) ani 420603 (není splněn výraz [0-9]+).

Příklady vyhledávání
Výraz Co se najde?
Praha. Řetězec Praha
Prah. Řetězce Praha, Prahy, Prahu apod.
Prah.* Řetězce Praha, Prahy, Prahu, . . . , Prahou apod.,
^Praha Řetězec Praha na počátku porovnávaného výrazu.
Praha$ Řetězec Praha na konci porovnávaného výrazu.
^Praha$ Řetězec Praha přesně jako hodnota porovnávaného výrazu.
P[rR][aA][hH][aA] Praha s možností malých i velkých písmen na druhé až páté pozici.
[a-zA-Z] Libovolné písmeno anglické abecedy.
[A-Z]* Řetězec libovolné délky složený pouze z velkých písmen anglické abecedy.
[A-Z][A-Z]* Řetězec (alespoň jednoznakový) složený pouze z velkých písmen anglické abecedy.
[A-Z].* Řetězec (alespoň jednoznakový), který zacíná velkým písmenem a dále obsahuje cokoliv.
part[0-9] Údaje part0, part1, . . . , part9.
[Rr][Ff][Cc][0-9].*\.[Hh][Tt][Mm].* Požadavek na vyhledání RFCdokumentu — na počátku názvu souboru musí být řetězec RFC bez ohledu na velikost písmen, pak musí být jedna číslice následovaná dalšími libovolnými znaky. Za tečkou se připouští řetězec htm s možným rozšírením (např. html).

zpět na začátek