IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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árne výrazy v C # .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
Regex r = 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 bool. 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())) {
    Console.WriteLine("Zadali jste platný email.");
} else {
    Console.WriteLine("Zadali jste NEplatný email.");
}
Console.ReadKey();

výsledok:

Regulárny výraz overujúce platnosť emailu - C # - Pre pokročilých

Teraz už vieme ako s regulárnymi výrazmi pracovať, teraz sa pozrieme ako je zapísať.

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:

  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ú z 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.


 

Všetky články v sekcii
C # - Pre pokročilých
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
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