Regulárne výrazy v Jave
Regulárne výrazy vznikli z dôvodu potreby práce s textovými reťazcami určitým unifikovaným spôsobom. Sú zaujímavý nástroj nielen na overenie, či zadaný textový reťazec spĺňa určené pravidlá (validácia), ale tiež nám umožňujú vyhľadávať určitej podreťazke pomerne jednoduchým spôsobom. Zbavíme sa tak mnohokrát aj niekoľkých vnorených podmienok.
Regulárny výraz je textový reťazec zložený z určitých znakov. Nepoznám nikoho, kto by si tento reťazec prečítal a ihneď pochopil, čo daný výraz znamená. Gramatika regulárnych výrazov nie je zložitá, ale je pomerne neprehľadná a preto je dobré už napísané výrazy komentovať. Na úvod ukážem príklad regulárneho výrazu:
Cieľom tohto regulárneho výrazu je zjednodušene zistiť, či je vložený textový reťazec emailom. Výraz je dosť zjednodušený, takže niektoré neplatné adresy ním prejdú.
Ukážeme si, ako sa dá s výrazmi pracovať v našich programoch a vysvetlíme si význam jednotlivých častí.
Trieda Pattern a Matcher
Trieda Patern nám umožňuje vytvoriť regulárny výraz, s ktorým je potom ďalej možné pracovať.
Trieda Matcher overuje či nejaký textový reťazec spĺňa kritériá dané regulárnym výrazom.
Hneď si to ukážeme. Vytvoríme si novú inštanciu patternu a odovzdáme mu regulárny výraz.
Následne vytvoríme Matcher, na ktorý zavoláme matcher objektu pattern.
Aby sa text overil, tak zavoláme metódu find() na matcher. Táto metóda vráti true ak text splnil pravidlá, pokiaľ pravidlá nesplní, vráti false. Ďalej už len pridáme podmienky, ktoré to overia:
Výsledok:
Teraz už vieme ako s regulárnymi výrazmi pracovať, teraz sa pozrieme ako ich zapísať.
Zápis regulárnych výrazov
Bodka
Bodka nahrádza ľubovoľný znak, napríklad pre výraz .... (4 bodky) bude platiť čokoľvek čo má 4 znaky.
Cdf = neplatné
Ahoj = platné
A@x9 = platné
A@x9O = platné
Všimnite si teraz jednu záludnosť pri poslednom príklade. Má 5 znakov av regulárnom výraze sú len 4 bodky, výraz by teda logicky prejsť nemal. Lenže ono je to riešené tak, že sa prechádza regulárny výraz a kontroluje sa:
- Prvý znak je bodka – výraz zatiaľ splnený
- Druhý znak je bodka – výraz zatiaľ splnený
- Tretí znak je bodka – výraz zatiaľ splnený
- Štvrtý znak je bodka – výraz splnený
- Žiadny ďalší znak vo výraze, výraz bol splnený.
Hranaté zátvorky
Hranaté zátvorky ukazujú na skupinu znakov, ktoré reťazec smie (alebo nesmie) obsahovať. Ak ich smie obsahovať, tak ich jednoducho napíšeme do zátvorky (ničím ich neoddeľujeme). Pokiaľ ich naopak nesmie obsahovať, pridáme pred znakmi ešte striešku (^, napíšete ju pomocou Alt + 94). Pokiaľ chcete určiť, že sa má overovať napríklad abeceda, tak nemusíte vypisovať abcd…., ale stačí uviesť [a-zA-z]. Týmto zaistíte, že sa skontrolujú všetky znaky, ktoré sú medzi az a AZ. Znaky sa berú s ASCII tabuľky, takže možno už daný výraz nesplnia.
Okrúhle zátvorky
Okrúhle zátvorky nám zoskupujú určitú časť výrazu. Kvantifikátory (viď. nižšie) sa potom vzťahujú na celý obsah zátvorky.
Escapovanie
Niekedy chcete vo výraze použiť nejaký metaznak, treba chcete overiť, či používateľ zadal (ahoj|svete). Jednotlivé "špeciálne" znaky musíte odescapovať, teda predsadiť spätným lomítkom (pravý alt + Q). Výraz by potom mohol vyzerať nasledovne:
Kvantifikátory
Kvantifikátory nám hovoria koľkokrát sa budú znaky opakovať. Kvantifikátorov je niekoľko typov, ten základný je {N}, kde N udáva počet opakovaní. Ďalej tu máme {N, M}, kde N je minimálny počet opakovaní a M maximálny. Ďalej ešte existujú preddefinované kvantifikátory. Otáznik (?) je alternatívou k {0, 1}, hviezdička {0-∞} a plus {1-∞}. Pri preddefinovanej hviezdičke a pluske to funguje pre maximálne nekonečno. Iný zápis pre nich neexistuje.
Príklad štyroch ľubovlných znakov, ktorý ste videli už v úvode, by teda šiel tiež zapísať ako:
Zástupné znaky
V praxi sa ešte používajú zástupné znaky. Tieto znaky skracujú výraz, ten sa potom číta (o trochu) lepšie.
Zástupné znaky sa píšu malými písmenami a potom sú tie isté akurát veľkými. Veľkými písmenami sú opakom tých malých. \d sú čísla 0-9 teda výraz je totožný s [0-9]. Keďže \D je totožný s [^0-9]. \w je potom pre akékoľvek písmeno, číslo alebo podčiarknutie. \s je pre biele znaky (napr. medzeru).
Príklady
Na nasledujúcich príkladoch si ukážeme validáciu niekoľkých reťazcov pomocou regulárnych výrazov. Uvidíte, že v nich môžete napísať doslova čokoľvek.
Príklad 1 – telefónne číslo
Ako príklad si skúste vymyslieť regulárny výraz, ktorý overí, či používateľ zadal platné telefónne číslo s predvoľbou Česka (+420), tak aj Slovenska (+421). Ďalších 9 čísel nebudeme riešiť, stačí vedieť, že ich je 9. Užívateľ môže dobrovoľne oddeliť medzerami trojice čísel. Číslo teda bude v tvare +420 123 456 789 alebo +420 123456789 alebo možno môžu byť medzery skombinované +421 123456 789.
Príklad riešenia:
Príklad 2 – validácia dátumu a času
Užívateľ nám zadá dátum vo formáte dd-mm-yyyy a dobrovoľne aj s časom hh:mm. Užívateľ pri dátume aj čase môže vynechať nulu. To znamená, že nemusí písať 15-02-2013 05:03 ale môže iba 15-2-2013 5:3. Užívateľ nemusí vypisovať celý rok 1999, ale môže iba 99. Užívateľ môže do dátumu zapísať iba čísla v rozmedzí 01 – 31. Pri mesiaci potom 01 – 12. Rok ľubovoľný, hodiny 0-23 a minúty 0 – 59.
Príklad riešenia:
Príklad 3 – validácia IP adresy
Užívateľ zadá IP adresu. IP adresa sa skladá zo štyroch čísel v rozsahu 0-255, tieto časti sú oddelené bodkou. Príklad platnej IP adresy je 1.234.1.234 a neplatné 1.234.432.1 (432 nie je v rozsahu). Užívateľ nemusí písať 025, ale môže len 25, rovnako nemusí písať 005, ale môže len 5.
Príklad riešenia:
V budúcom dieli si ukážeme ďalšie zaujímavejšie funkcie, než len porovnávanie s reťazcom.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 345x (7.06 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java