IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Regulérny výraz overujúci platnosť emailu v Jave - Java - Pre pokročilých - Java - Pre pokročilých

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:

  1. Prvý znak je bodka – výraz zatiaľ splnený
  2. Druhý znak je bodka – výraz zatiaľ splnený
  3. Tretí znak je bodka – výraz zatiaľ splnený
  4. Štvrtý znak je bodka – výraz splnený
  5. Žiadny ďalší znak vo výraze, výraz bol splnený.
Ako vidíte, reťazec je overený tak, či obsahuje regulárny výraz. Pokiaľ obsahuje niečo navyše, prejde rovnako. Z toho dôvodu sa metóda volá find. Riešenie tohto problému je však jednoduché, jednoducho pred výraz pridáme striešku (^, Alt + 94), ktorá zaistí, že na začiatku reťazca bude testovaný text a za výraz dáme dolár ($, pravý alt + Ů). Metaznak $ zaisťuje overenie od konca reťazca, teda od konca overíme, či reťazec spĺňa pravidlo odzadu aj odpredu. V zátvorkách sa už pravidlo overuje bežným smerom.

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é 342x (7.06 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Všetky články v sekcii
Java - Pre pokročilých
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity