Regulárne výrazy vo VB.NET
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 pre overenie, či zadaný textový reťazec spĺňa určená pravidlá (validácia), ale tiež nám umožňujú vyhľadávať určité podreťazca pomerne jednoduchým spôsobom. Zbavíme sa tak veľakrát aj niekoľkými 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:
[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}
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 Regex
Trieda Regex nám umožňuje pracovať s regulárnymi výrazmi. V konstruktoru ju odovzdáme onen regulárny výraz a následne pomocou metódy IsMatch () zistíme, či zadaný textový reťazec spĺňa pravidlo. Možno to znie zmätene, pretože reťazec testujeme reťazcom.
Hneď si to ukážeme. Vytvoríme si novú inštanciu Regex a odovzdáme mu regulárny výraz.
' Regulérní výraz pro ověření emailové adresy Dim r As Regex = New Regex("[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}")
Následne zavoláme metódu IsMatch (), ktorá vracia hodnotu typ Boolean. True ak testovaný reťazec pravidlá splnil, false ak nie. Následne si môžeme urobiť podmienku, ktorá overí či užívateľ zadal platný email:
Console.Write("Zadejte email: ") If (r.IsMatch(Console.ReadLine())) Then Console.WriteLine("Zadali jste platný email.") Else Console.WriteLine("Zadali jste NEplatný email.") End If Console.ReadKey()
výsledok:
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 jednej záludnosti u posledného príklade. Má 5 znakov a v regulárnym výrazu 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ý.
Ako vidíte, reťazec je overený tak, či obsahuje regulárny výraz. Ak obsahuje niečo navyše, prejde rovnako. Z toho dôvodu sa metóda volá find. Riešenie tohto problému je však ľahké, 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 + OV). Metaznaky $ zabezpečuje overenie od konca reťazca, teda od konca overíme, či reťazec spĺňa pravidlo odzadu i 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 je smie obsahovať, tak ich jednoducho napíšeme do zátvorky (ničím je neoddeľuje). Ak je naopak nesmie obsahovať, pridáme pred znaky ešte striešku (^, napíšete ju pomocou Alt + 94). Ak chcete určiť, že sa má overovať treba 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 treba č už daný výraz nesplní.
Okrúhle zátvorky
Okrúhle zátvorky nám zoskupujú určitú časť výrazu. Vyčíslením (viď. Nižšie) sa potom vzťahujú na celý obsah zátvorky.
Uvádzacích
Niekedy chcete vo výraze použiť nejaký metaznaky, treba chcete overiť, či používateľ zadal (ahoj | svete). Jednotlivé "špeciálne" znaky musíte odescapovat, teda predsadiť spätným lomítkom (pravý alt + Q). Výraz by potom mohol vyzerať nasledovne:
\(ahoj\|světe\)
Vyčíslením
Vyčíslením 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álna. Ďalej ešte existujú preddefinované kvantifikátory. Otáznik (?) Je alternatívou k {0, 1}, hviezdička {0-∞} a plus {1-∞}. U preddefinované hviezdičky a pluska to funguje pre maximálne nekonečno. Iný zápis pre nich neexistuje.
Príklad štyroch libovlných znakov, ktorý ste videli už v úvode, by teda šiel tiež zapísať ako:
^.{4}$
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]. Kdežto \ D je totožný s [^ 0-9]. \ W je potom pre akékoľvek písmeno, číslo alebo podčiarkovník. \ 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 užívateľ zadal platné telefónne číslo s predvoľbou Česka (+420), tak i Slovenska (+421). Ďalších 9 čísiel 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 napríklad môžu byť medzery skombinované +421 123456 789.
Príklad riešenia:
^(\+420|\+421) ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$
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ľ u dáta i času môže vynechať nulu. To znamená, že nemusí písať 15-02-2013 05:03 ale môže len 15-2-2013 5: 3. Užívateľ nemusí vypisovať celý rok 1999, ale môže len 99. Užívateľ môže do dátumu zapísať iba čísla v rozmedzí 01 - 31. U mesiace potom 01 - 12. Rok ľubovoľný, hodiny 0-23 a minúty 0 - 59.
Príklad riešenia:
^[0-3]?[0-9]-[01]?[0-9]-[0-9]{2,4}( [0-2]?[0-9]:[0-5]?[0-9])?$
Príklad 3 - validácia IP adresy
Užívateľ zadá IP adresu. IP adresa sa skladá zo štyroch čísel v rozsahu 0-255, tieto časťou sú oddelené bodkou. Príklad platné IP adresy je 1.234.1.234 a neplatné 1.234.432.1 (432 nie je v rozsahu). Používateľ nemusí písať 025, ale môže len 25, rovnako tak nemusí písať 005, ale môže len 5.
Príklad riešenia:
^((2[0-5][0-5])|(0?[0-9][0-9])|((0{2})?[0-9])|(1[0-9][0-9]))\.((2[0-5][0-5])|(0?[0-9][0-9])|((0{2})?[0-9])|(1[0-9][0-9]))\.((2[0-5][0-5])|(0?[0-9][0-9])|((0{2})?[0-9])|(1[0-9][0-9]))\.((2[0-5][0-5])|(0?[0-9][0-9])|((0{2})?[0-9])|(1[0-9][0-9]))$
V budúcom dieli si ukážeme ďalšie zaujímavejšie funkcie, než len porovnávaní s reťazcom.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 254x (69.51 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB