Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Regulární výrazy ve VB.NET

Regulární výrazy vznikly z důvodu potřeby práce s textovými řetězci určitým unifikovaným způsobem. Jsou zajímavý nástroj nejen pro ověření, zdali zadaný textový řetězec splňuje určená pravidla (validace), ale také nám umožňují vyhledávat určité podřetězce poměrně jednoduchým způsobem. Zbavíme se tak mnohdy i několika vnořených podmínek.

Regulární výraz je textový řetězec složený z určitých znaků. Neznám nikoho, kdo by si tento řetězec přečetl a ihned pochopil, co daný výraz znamená. Gramatika regulárních výrazů není složitá, ale je poměrně nepřehledná a proto je dobré již napsané výrazy komentovat. Na úvod ukáži příklad regulárního výrazu:

[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}

Cílem tohoto regulárního výrazu je zjednodušeně zjistit, zda-li je vložený textový řetězec emailem. Výraz je dost zjednodušený, takže některé neplatné adresy jím projdou.

Ukážeme si, jak se dá s výrazy pracovat v našich programech a vysvětlíme si význam jednotlivých částí.

Třída Regex

Třída Regex nám umožňuje pracovat s regulárními výrazy. V konstruktoru ji předáme onen regulární výraz a následně pomocí metody IsMatch() zjistíme, jestli zadaný textový řetězec splňuje pravidlo. Možná to zní zmateně, protože řetězec testujeme řetězcem.

Hned si to ukážeme. Vytvoříme si novou instanci regexu a předáme mu regulární 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ásledně zavoláme metodu IsMatch(), která vrací hodnotu typ Boolean. True pokud testovaný řetězec pravidla splnil, false pokud ne. Následně si můžeme udělat podmínku, která ověří jestli uživatel 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ýsledek:

Regulární výraz ověřující platnost emailu - Objektově orientované programování ve Visual Basic .NET

Zápis regulárních výrazů

Tečka

Tečka nahrazuje libovolný znak, například pro výraz .... (4 tečky) bude platit cokoliv co má 4 znaky.

Cdf = neplatné

Ahoj = platné

A@x9 = platné

A@x9O = platné

Všimněte si teď jedné záludnosti u posledního příkladu. Má 5 znaků a v regulárním výrazu jsou jen 4 tečky, výraz by tedy logicky projít neměl. Jenže ono je to řešené tak, že se prochází regulární výraz a kontroluje se:

  1. První znak je tečka – výraz zatím splněn
  2. Druhý znak je tečka – výraz zatím splněn
  3. Třetí znak je tečka – výraz zatím splněn
  4. Čtvrtý znak je tečka – výraz splněn
  5. Žádný další znak ve výrazu, výraz byl splněn.

Jak vidíte, řetězec je ověřen tak, jestli obsahuje regulární výraz. Pokud obsahuje něco navíc, projde stejně. Z toho důvodu se metoda jmenuje find. Řešení tohot problému je však snadné, jednoduše před výraz přidáme stříšku (^, Alt + 94), která zajistí, že na začátku řetězce bude testovaný text a za výraz dáme dolar ($, pravý alt + Ů). Metaznak $ zajišťuje ověření od konce řetězce, tedy od konce ověříme, jestli řetězec splňuje pravidlo odzadu i odpředu. V závorkách se již pravidlo ověřuje běžným směrem.

Hranaté závorky

Hranaté závorky ukazují na skupinu znaků, které řetězec smí (nebo nesmí) obsahovat. Pokud je smí obsahovat, tak je jednoduše napíšeme do závorky (ničím je neoddělujeme). Pokud je naopak nesmí obsahovat, přidáme před znaky ještě stříšku (^, napíšete ji pomocí Alt + 94). Pokud chcete určit, že se má ověřovat třeba abeceda, tak nemusíte vypisovat abcd…., ale stačí uvést [a-zA-z]. Tímto zajistíte, že se zkontrolují všechny znaky, které jsou mezi a-z a A-Z. Znaky se berou s ASCII tabulky, takže třeba č už daný výraz nesplní.

Kulaté závorky

Kulaté závorky nám seskupují určitou část výrazu. Kvantifikátory (viz. níže) se pak vztahují na celý obsah závorky.

Escapování

Někdy chcete ve výrazu použít nějaký metaznak, třeba chcete ověřit, jestli uživatel zadal (ahoj|světe). Jednotlivé "speciální" znaky musíte odescapovat, tedy předsadit zpětným lomítkem (pravý alt + Q). Výraz by pak mohl vypadat následovně:

\(ahoj\|světe\)

Kvantifikátory

Kvantifikátory nám říkají kolikrát se budou znaky opakovat. Kvantifikátorů je několik typů, ten základní je {N}, kde N udává počet opakování. Dále tu máme {N, M}, kde N je minimální počet opakování a M maximální. Dále ještě existují předdefinované kvantifikátory. Otazník (?) je alternativou k {0, 1}, hvězdička {0-∞} a plus {1-∞}. U předdefinované hvězdičky a pluska to funguje pro maximálně nekonečno. Jiný zápis pro ně neexistuje.

Příklad čtyř libovlných znaků, který jste viděli již v úvodu, by tedy šel také zapsat jako:

^.{4}$

Zástupné znaky

V praxi se ještě používají zástupné znaky. Tyto znaky zkracují výraz, ten se pak čte (o trochu) lépe.

Zástupné znaky se píší malými písmeny a pak jsou tytéž akorát velkými. Velkými písmeny jsou opakem těch malých. \d jsou čísla 0-9 tedy výraz je totožný s [0-9]. Kdežto \D je totožný s [^0-9]. \w je pak pro jakékoliv písmeno, číslo nebo podtržítko. \s je pro bílé znaky (např. mezeru).

Příklady

Na následujících příkladech si ukážeme validaci několika řetězců pomocí regulárních výrazů. Uvidíte, že v nich můžete napsat doslova cokoliv.

Příklad 1 – telefonní číslo

Jako příklad si zkuste vymyslet regulérní výraz, který ověří, zdali uživatel zadal platné telefonní číslo s předvolbou Česka (+420), tak i Slovenska (+421). Dalších 9 čísel nebudeme řešit, stačí věďět že jich je 9. Uživatel může dobrovolně oddělit mezerami trojice čísel. Číslo tedy bude ve tvaru +420 123 456 789 nebo +420 123456789 nebo třeba mohou být mezery zkombinované +421 123456 789.

Příklad řešení:

^(\+420|\+421) ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$

Příklad 2 – validace data a času

Uživatel nám zadá datum ve formátu dd-mm-yyyy a dobrovolně i s časem hh:mm. Uživatel u data i času může vynechat nulu. To znamená, že nemusí psát 15-02-2013 05:03 ale může jenom 15-2-2013 5:3. Uživatel nemusí vypisovat celý rok 1999, ale může jenom 99. Uživatel může do data zapsat pouze čísla v rozmezí 01 – 31. U měsíce pak 01 – 12. Rok libovolný, hodiny 0-23 a minuty 0 – 59.

Příklad řešení:

^[0-3]?[0-9]-[01]?[0-9]-[0-9]{2,4}( [0-2]?[0-9]:[0-5]?[0-9])?$

Příklad 3 – validace IP adresy

Uživatel zadá IP adresu. IP adresa se skládá ze čtyř čísel v rozsahu 0-255, tyto částí jsou oddělené tečkou. Příklad platné IP adresy je 1.234.1.234 a neplatné 1.234.432.1 (432 není v rozsahu). Uživatel nemusí psát 025, ale může jen 25, stejně tak nemusí psát 005, ale může jen 5.

Příklad řešení:

^((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 příštím dílu si ukážeme další zajímavější funkce, než jen porovnávaní s řetězcem.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 254x (69.51 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

Předchozí článek
Kvíz - Objektově orientované programování ve VB.NET
Všechny články v sekci
Objektově orientované programování ve Visual Basic .NET
Článek pro vás napsal Michal Žůrek - misaz
Avatar
Uživatelské hodnocení:
3 hlasů
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