Regulární výrazy ve VB.NET

Ostatní jazyky Visual Basic .NET 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

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ženo 235x (69.51 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

  Aktivity (1)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
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.

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Visual Basic (VB .NET)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!