Dodatek A

 

      Regulární výrazy a jak je používat

     

    V mnoha parametrech, které jsou v konfiguraci používány pro vyhledávání v textech, je možno namísto jednoduchých slov nebo skupin slov používat tzv. regulární výrazy, které umožní mnohem efektivnější a sofistikovanější prohledávní textů. Systém používá regulární výrazy kompatibilní s jazykem PERL obvykle nazývané jako regulární výrazy Unixového stylu.

    Jak psát a co dělají regulární výrazy

    Základním pravidlem je, že každý znak se shoduje sám se sebou, pokud to zrovna není některý z tzv. meta-znaků, které mají speciální význam a jsou vypsány v následující tabulce.
    Posloupnost znaků ve vyhledávacím (regulárním) výrazu je obvykle vyhledávána v cílovém textu (textovém řetězci). Například text "nazdar" zadaný jako regulární výraz bude v cílovém textu nalezen jako "nazdar". To je jednoduché.

      Přehledová tebulka meta-znaků

      ZnakVýznam
      ^ začátek řádky
      $ konec řádky
      . jakýkoliv znak
      \ obrácené lomítko
      * žádná nebo více shod, podobně jako {0,}
      + jedna nebo více shod, podobně jako {1,}
      ? jedna nebo žádná shoda, podobně jako {0,1}
      {n} shoduje se přesně n krát
      {n,} shoduje se alespoň n krát
      {n,m} shoduje se alespoň n-krát ale ne více než m-krát
      [aeiou0-9] shoduje se se znaky a, e, i, o, u, a čísly 0 až 9 ;
      [^aeiou0-9] Shoda s čímkoliv kromě znaků a, e, i, o, u, a čísla 0 až 9
      \w shoduje se s libovolným alfanumerickým znakem (včetně "_")
      \W shoduje se s nealfanumerickým znakem
      \d shoduje se s numerickým znakem
      \D shoduje se s nenumerickým znakem
      \s shoduje se s mezerou (stjeně jako ([ \t\n\r\f])
      \S shoduje se s jakýkoliv znakem kromě mezery
      \1..\9 zpětné reference

    Je možné, aby i znaky, které jsou běžně považovány za meta-znaky, byly interpretovány jako běžné znaky v textu, jestliže je před nimi uvedeno zpětné lomítko "\".
    Například, "^" znamená začátek řadky, ale "\^" znamená znak"^", obdobně "\\" znamená znak "\" a tak dále.

    Mnohé znaky mohou být specifikovány s použitím meta-znaků obdobně jako v jazyce C. ``\n'' znamená nový řádek, ``\t'' tab, ``\r'' návrat vozíku (carriage return), ``\f'' novou stránku, a podobně. Ještě obecněji, každý znak lze zapsat jako \xnn, kde nn je hexadecimální číslo, které patří znaku s ASCII hodnotou nn. Jestliže je zapotřebí rozsáhlejšího kódování znaků kódem Unicode, je možno používat syntaxi '\x{nnnn}', kde 'nnnn' - je jedna nebo více hexadecimálních číslic.

    Je možno specifikovat i třídu znaků tak, že se seznam znaků uzavře do hranatých závorek []. Takový výraz se pak bude shodovat s kterýmkoliv znakem uvedeným v seznamu. Jestliže prvním znakem po ``['' je ``^'', taková třída se shoduje s jakýkoliv znakem, který není v seznamu znaků v třídě uveden.

    V seznamu znaků ve třídě je ``-'' znak používán k tomu, aby specifikoval interval. a-z pak reprezentuje libovlné znaky od ``a'' do ``z'', včetně. Jestliže je zapotřebí, aby součástí třídy byl i znak ``-'', musí být umístěn na začátku nebo na konci v seznamu znaků ve třídě.

    Všechny následující příklady představují tytéž sady: [-az], [az-], a [a\-z]. Všechy se liší od [a-z], tím že obsahují i znak ``-''. Jestliže má být v sadě obsažen i znak ']' musí být uveden na začátku seznamu znaků nebo mu musí předcházet zpětné lomítko.

    Příklady některých intervalů jsou: [\n-\x0D] se shoduje s kterýmkoliv číslem uvedeným jako #10,#11,#12,#13. [\d-t] se shoduje s jakýmkoliv číslem, pomlčkou nebo znakem 't'. []-a] se shoduje s libovolným znakem od ']' do 'a'.

    Jeden z nejdůležitějších meta-znaků, tečka ``.'', znamená libovolný znak kromě ``\n'' Znak "^" znamená začátek řádky (řetězce), a znak "$" jeho konec. Výraz ^.*$ pak znamená všechny znaky od začátku do konce řádku .

    Alternativy lze specifikovat jejich oddělením znakem ``|'', takže pak regulární výraz fee|fie|foe se bude shodovat s kterýmkoliv ze slov ``fee'', ``fie'' nebo ``foe'' v cílovém textu (obdobně jako f(e|i|o)e). První alternativa zahrnuje všechno od posledního oddělovače last (``('', ``['', nebo začátku výrazu) až do posledního ``|'', a poslední alternativa zahrnuje všechno od posledního ``|'' do dalšího oddělovače výrazu. Proto aby nedocházelo k nedorozuměním, jsou obvykle alternativy uzavírány do kulatých závorek (fee|fie|foe).

    Alternativy jsou vyhodnocovány z leva do prava, aby byla nalezena první alternativa, pro kterou platí celý výraz. Je dobré si pamatovat i to, že``|'' je v hranatých závorkách interpretováno jako literal, takže výraz [fee|fie|foe] se shoduje s [feio|].

    Závorková konstrukce ( ... ) může být použita i pro definici subvýrazů. Ty jsou pak číslovány podle sad závorek z leva do prava. První subvýraz má číslo '1'.

    Uvnitř tříd je možno použít i \w, \d a \s.

    \1 až \9 jsou interpretovány jako zpětné reference. \ se shoduje s minule shodným subvýrazem #. Například : '(.)\1+' se shoduje s 'aaaa' a 'cc'. '(.+)\1+' také s 'abab' a '123123'.


© Copyright 2001-2005 DS&T s.r.o,
www.bizz.cz