Links ::  | DEV web management system | Katalóg | Webhosting | Recepty
  
 Index | Registrácia | Hľadať | Galéria | BoardNeprihlásený užívateľ  //Utorok, 21. Novembra 2017 
Navigation
Index
Top 10 autorov
Top 20 článkov
Hľadať
Galéria

Zones
Asp.(NET)
C/C++
Flash
Grafika+Design
Hardware
Hry
Html/Css/Xml
Java
Linux
Networks
Operačný systém
Pascal/Delphi
PHP
Security
Software
SQL
Visual Basic
Wap/Wml
Windows
Zóna iné

Links
Script index Interval.cz Pc.sk Regedit.sk TipyaTriky.sk Builder.cz Asp.cz Živě.sk Zoznam.sk Code.box.sk Root.cz Quant&Financial

Odkazy

Sessions
Stránky Developer.sk si práve číta 429 čitateľov, z toho je 0 zaregistrovaných

BackEnd
Odkazy na nové články je možné preberať pomocou backend.php

kuk

    Pravidlá pre porovnávanie v reg. výrazoch - 7. čas

V minulej časti sme si povedali, čo to regulárne výrazy sú a ozrejmili sme si niektoré základné pravidlá v ich použití. Dnes si povieme niečo o pravidlách, ktoré sa používajú pri porovnávaní vzoru s reťazcom.



Pre porovnávanie v Perli sa využíva tzv. nedeterministický konečný automat - pamätá si, čo už vyskúšal a čo nie, pokým niečo neuspeje, vráti sa opäť na začiatok a skúša čosi iné. Z tohto vidno, že pri zle napísanom vzore pre porovnanie sa môže beh programu pomerne dosť spomaliť.

Nižšie uvedené pravidlá sú dané v poradí, akým automat v Perli postupuje pri porovnávaní. Vo všeobecnosti sa dá povedať, že Perl preferuje zhodu čo najviac vľavo pred najdlhšou zhodou.

Pravidlo č. 1

Automat sa snaží nájsť zhodu čo najviac vľavo v reťazci tak, aby sa celý výraz zhodoval podľa pravidla č. 2.
Kôli tomuto sa porovnávanie začína pred prvým znakom v reťazci. Porovnávanie je úspešné, ak je nájdená zhoda celého reg. výrazu pred koncom reťazca. AK je porovnanie úspešné, okamžite sa ukončí aby sa predišlo ďalšímzbytočným porovnávaniam. Toto porovnávanie nemusí dosiahnuť koniec reťazca, len koniec reg. výrazu (ak to nie je explicitne určené inak). Ak sa na prvom mieste nenájde zhoda, automat pokračuje od ďalšej pozície (medzi prvým a druhým znakom). Porovnávanie zlyháva až potom, ak sa nenájde zhoda reg. výrazu vo všetkých miestach v reťazci, vrátane miesta za posledným znakom.
Keďže miesta, od ktorých sa zhoda vyhľadáva sú medzi znakmi reťazca, treba byť pri písaní reg. výrazov pozorný. Ak by ste totiž zadali reg. výraz ako /o*/ (zhoda so žiadnym alebo viacerými znakmi o) a reťazec bude obsahovať napr. slovo "ahoj", bude zhoda nájdená s nulovým reťazcom na začiatku pred "a" namiesto zhody s "o" na treťom mieste. V takomto prípade je lepšie miesto kvantifikátoru * použiť +, to jest reg. výraz by bol /o+/.

Pravidlo č. 2

V tomto prípade sa celý reg. výraz považuje za množinu alternatív. Ak exsituje viac alternatív, sú oddelené znakom | (pipe). Množina alternatív sa zhoduje vtedy, ak sa zhoduje ľubovolná z alternatív podľa pravidla č. 3. Alternatívy sa skúšajú v smere zľava doprava a porovnávanie sa zastaví na prvej nájdenej zhode. Pokým nevyhovuje žiadna alternatíva, porovnávanie sa vráti k pravidlu, ktoré vyvolalo pravidlo č. 2 ( to môžu byť pravidlá 1, 4 alebo 6). Toto pravidlo potom hľadá znovu pozíciu, an ktorej by sa dalo pravidlo č. 2 použiť.
Ak existuje len jedna alternatíva, táto sa zhoduje alebo nie a pravidlo stále platí. Nulová alternatíva tu neexistuje, pretože s čímkoľvek s nulovou dĺžkou sa zhoduje nulový reťazec.

Pravidlo č. 3

Ľubovoľná alternatíva sa bude zhodovať vtedy, ak sa zhoduje postupne každá položka podľa pravidiel 4 a 5. Položka sa skadá z tvrdenia, definovaného pravidlom 4 alebo z kvantifikovaného atómu popísaného v pravidle 5. Položky, u ktorých je uvedených viac možností zhody majú priradené poradie zľava doprava. Ak sa položky nezhodujú, automat sa vráti k ďalšej alternatíve podľa pravidla č. 2.
Položky, ktoré sa musia zhodovať podľa svojho poradia nie sú v reg. výraze nijako syntakticky oddelené. Ak požadujete porovnanie podľa /^foo/, požadujete porovnanie štyroch položiek - nulového tvrdenia a tromch písmen, ktoré sa musia zhodovať samy so sebou presne v tom poradí, v akom sú uvedené v reg. výraze.

Pravidlo č. 4

Tvrdenie sa musí zhodovať podľa nasl. tabuľky. Ak tvrdenie v aktuálnej pozícii nevyhovuje, automat sa vráti k pravidlu č. 3 a skúša iné možnosti s položkou s vyšším poradím.

Tvrdenie Význam
^ Zhoduje sa so začiatkom reťazca (riadku, ak je použité /m)
$ Zhoduje sa s koncom reťazca (riadku, ak je použité /m)
\b Zhoduje sa s hranicou slova (medzi \w a \W)
\B Zhoduje sa so všetkým okrem hranice slova
\A Zhoduje sa so začiatkom reťazca
\Z Zhoduje sa s koncom reťazca
\G Zhoduje sa tam, kde skončilo m//g
(?...) Zhoduje sa ak by automat našiel zhodu s ...ďalej
(?!...) Zhoduje sa ak by automat nenašiel zhodu s ...ďalej

Tvrdenia $ a \Z sa nemusia zhodovať len s koncom reťazca, ale aj o jeden znak skôr, ak je posledným reťazcom znak nového riadku.
Tvrdenia (?...) a (?!...) hľadiace dopredu majú samy o sebe nulovú dĺžku, tvrdia však, že sa v tomto mieste, kde sa pokúšame o porovnanie, zhoduje (alebo nezhoduje) regulárny výraz, ktorý je vo vyššie uvedenej tabuľke reprezentovaný ako "našiel zhodu s ..." a "nenašiel zhodu s ...". Automat sa vráti späť k pravidlu č. 2, kde podvýraz otestuje a potom vymaže akýkoľvek záznam o tom, koľko reťazcov bolo pohltených, pričom ako výsledok tvrdenia vráti len úspech alebo neúspech tohoto podvýrazu.

Pravidlo č. 5

Kvantifikovaný atóm sa zhoduje len vtedy, ak sa zhoduje toľkokrát za sebou, ako je dané kvantifikátorom. Tabuľku so zoznamom kvantifikátorov nájdete v predchádzajúcej časti.
Kvantifikátory sa snaži avždy nájsť najdlhšiu zhodu.
Pokým definujete reg. výraz ako napr. /.*foo/, automat sa pokúsi nájsť zhodu s maximálnym počtom ľubovoľných znakov (sú reprezentované bodkou) až do konca riadku a potom sa snaží nájsť "foo". Toto samozrejme nie je možné, pretože "foo" sa nemôže zhodovať s nulovým reťazcom na konci riadku. Automat sa teda vracia o znak späť, pokým nenájde "foo". Pokým je na riadku viac ako jeden výskyt "foo", vyhľadávanie sa zastaví na poslednom a všetky ostatné možnosti ktoré boli nájdené budú zabudnuté.
Pokým by ste chceli, aby ktorýkoľvek z kvantifikátorov hľadal najkratšiu zhodu, dosiahnete to umiestnením znaku ? za tento kvantifikátor. Pokým teda zadáte reg. výraz /.*?foo/, automat bude hľadať zhodu nie od konca riadku, ale od nultej pozície v riadku, takže vyhľadávanie sa zastaví pri prvom nájdenom "foo".

Pravidlo č. 6

Každý atóm sa porovná na zhodu podľa svojho typu podľa typov uvedených nižšie. Ak sa atóm nezhoduje alebo neumožňuje zhodu zbytku reg. výrazu, vracia sa automat späť k pravidlu 5 a skúša ďaľšiu možnosť podľa kvantifikovaného atómu.

Typy atómov:
  • Reg. výraz v zátvorkách, (...), sa zhoduje poľa toho, či sa zhoduje reg. výraz (tu reprezenovaný ako ...) podľa pravidla č. 2. Zátvorky teda slúžia ako operátor zoskupenia pre kvantifikátory.
  • Znak "." (bodka) sa zhoduje s ľubovoľným znakom okrem \n (nový riadok).
  • Zozonam znakov uvedených v hranatých zátvorkách sa zhoduje s ľubovoľným jedným znakom zo zoznamu. Uvednením znaku "^" na začiatok zoznamu sa spôsobí, že sa budú zhodovať len tie znaky, ktoré v zozname nie sú uvedené. Rozsah znakov môže byť vyznačený pomocou notácie a-z. Môže tiež byť použitý niektorý z kódov \d, \w, \s, \n, \r, \t, \f alebo \nnn (vysvetlené nižšie). Pokým chcete v zozname porovnať pomlčku alebo pravú hranatú zátvorku, je nutné pred nimi použiť spätné lomítko ("\"). Pokým chcete porovnať znak "^", nedávajte ho na prvé miesto v zozname.
  • Písmeno, pred ktorým je uvedené spätné lomítko ("\") sa zhoduje so zvláštnym znakom alebo triedou znakov:

    Kód Zodpovedá
    \a pípnutie
    \n nový riadok
    \r návrat vozíku na začiatok riadku (CR)
    \t tabulátor
    \f nová stránka
    \e escape
    \d číslica (rovnaké ako [0-9])
    \D iný znak ako číslica
    \w znak slova, alfanumerický (rovnaké ako [a-zA-Z_0-9])
    \W iný znak ako znak slova
    \s prázdny znak (ako [\t\n\r\f])
    \S iný ako prázdny znak

  • Číslo o dĺžke jednej číslice pred ktorým je znak "\" sa zhoduje s tým, s čím sa v skutočnosti zhodujú zodpovedajúce zátvorky. Tomuto sa hovorí spätné odkazovanie. Číslo zložené z viacerých číslic uvedené znakom "\" sa považuje za spätný odkaz, pokým vzor pred ním obsahuje aspoň toľko podreťazcov a toto čislo nezačína číslicou 0. Dvojice zátvoriek sú číslované zľava podľa poradia ľavej zátvorky.
  • Osmičkové číslo zložené z dvoch alebo troch číslic, ktoré je uvedené znakom "\" sa zhoduje so znakom špecifikovanej hodnoty, pokým sa nejedná o spätný odkaz.
  • Písmeno x uvedené znakom "\" a nasledované jednou alebo dvoma hexadecimálnymi číslicami sa zhoduje so znakom majúcim danú šestnástkovú hodnotu.
  • Písmeno c uvedené znakom "\" a nasledované jedným písmenom sa zhoduje so zodpovedajúcim kontrolným (control) znakom.
  • Akýkoľvek iný znak uvedený znkom "\" sa zhoduje s týmto znakom.
  • Akýkoľvek iný tu neuvedený znak sa zhoduje sám so sebou.

    To by bolo k pravidlám pre reg. výrazy všetko, nabudúce dokončíme rozpravu o regulárnych výrazoch.


    Autor : Developer, čítané 3743x, komentárov: 0
    Hodnotenie :    |  Pondelok, 17. Marca 2003

    Pridať nový komentár/Komentáre
    Vaše hodnotenie :   horšie  lepšie
  • Login
    Login:
    Heslo:

    Hľadať
     
    v článkoch
    v diskusiach
    v komentároch

    Top read
    PHP Coder

    Priklady v C. 1.čast.

    DEV web management system

    Php a bezpečnosť skriptov

    Autorun CD

    Top discuss
    Jednoduchý web formulár (ASP.NET)

    Delphi seriál: (1.časť)

    Velmi rychla grafika v Pascale

    DEV web management system

    Naša ikona
    Páčia sa Vám naše stránky ? Ak áno, podporte nás prosím a umiestnite si na svoju stránku našu ikonku:





    Copyright (c) Developer.sk, All rights reserved.
    Powered by DEV web management system