Regulární výrazy ve VB.NET
V předchozím kvízu, Kvíz - Objektově orientované programování ve VB.NET, jsme si ověřili nabyté zkušenosti z kurzu.
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:
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:
- První znak je tečka – výraz zatím splněn
- Druhý znak je tečka – výraz zatím splněn
- Třetí znak je tečka – výraz zatím splněn
- Čtvrtý znak je tečka – výraz splněn
- Žá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