September discount week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

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._-][email protected][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._-][email protected][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:

Regulárny výraz overujúce platnosť emailu

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é

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

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:

  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. 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é 251x (69.51 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
Nullovatelné typy, klonovanie, atribúty, destruktor v VB.NET
Všetky články v sekcii
Objektovo orientované programovanie vo Visual Basic .NET
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Ako sa ti páči článok?
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 (1)

 

 

Komentáre

Avatar
Martin Obert
Člen
Avatar
Martin Obert:9.11.2017 14:40

Zdravím. momentálne sa pasujem s niečim podobným a neviem s tým pohnúť. Ide o zdorjový súbor, ktorý mám načítať do Excelu, ale jeho štruktúra je vždy rozdielna pre každý súbor. Napríklad jeden súbor má štruktúru
0.00;3.72;0.000;0­.000;15/03/2017;10:24:26
0.00;3.75;0.000;0­.000;15/03/2017;10:24:27
0.00;3.59;0.000;0­.000;15/03/2017;10:24:28
0.00;3.79;0.000;0­.000;15/03/2017;10:24:29
.......

iný môže mať
20/10/2016 / 14:42:28 / 3 Pa
20/10/2016 / 14:42:29 / 3 Pa
20/10/2016 / 14:42:30 / 4 Pa
20/10/2016 / 14:42:31 / 2 Pa
20/10/2016 / 14:42:32 / 3 Pa
20/10/2016 / 14:42:33 / 3 Pa
20/10/2016 / 14:42:34 / 2 Pa
20/10/2016 / 14:42:35 / 3 Pa
20/10/2016 / 14:42:36 / 3 Pa....

No a ja by som potreboval nejako cez tieto dáta vo vba /lebo vo firme iný jazyk nemáme/ prechádzať a do Excelu vypísať dátum, čas, tlak, teda by to vyzeralo v Exceli nejako takto:
Date Time Pressure
15/03/2017 10:24:26 3,72
15/03/2017 10:24:27 3,75
15/03/2017 10:24:28 3,59
15/03/2017 10:24:29 3,79
15/03/2017 10:24:30 3,67
15/03/2017 10:24:31 3,48
15/03/2017 10:24:32 3,56
15/03/2017 10:24:33 3,48
15/03/2017 10:24:34 3,37
15/03/2017 10:24:35 3,54
15/03/2017 10:24:36 3,47
15/03/2017 10:24:37 3,69
15/03/2017 10:24:38 3,48
15/03/2017 10:24:39 3,66
....
Už som dokázal rozdeliť dáta pomocou delimitera cez funkciu split
LineResult() = Split(strLineItem, Delimiter)
ale potrebujem nejako testovať vzniknuté slová wrd v poli LIneResult. Nulové hodnoty vylúčiť (ak tam sú), dátum zapísať ako prvý v riadku, potom čas a potom tlak.
Asi to je jednoduché, len ja už nemám tieto veci zvládnuté. Ak by niekto vedel pomôcť vopred ďakujem. S pozdravom, Martin.

 
Odpovedať
9.11.2017 14:40
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 1 správy z 1.