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 v C# .NET - Úvod

V dnešním článku se dozvíme co jsou regulární výrazy, jak je psát a jak se s nimi pracuje v jazyce C# .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ým nástrojem 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. Zbavíme se tak mnohdy i několika vnořených podmínek.

Regulární výrazy nám také pomůžou s filtrováním dat z formuláře, vyhledáváním v textu nebo zpracováváním řetězců. Nejčastěji je využijeme při ověřování položek formuláře. S regulárními výrazy se dá dělat plno věcí, například zvýrazňovat slova v textu nebo třeba měnit formát data.

Nejprve se ale pojďme podívat na rozdíl mezi validací a čištěním dat.

Validace x čištění dat

Přistupujeme-li k datům z databáze, která prošla prvotní kontrolou, nemusíme je už čistit. Stačí se podívat, jestli splňují naše podmínky, a v tom případě je použít.

Naopak dostaneme-li data z formuláře, který vyplňoval uživatel, musíme je očistit a až potom validovat.

Každý vstup musí být alespoň základně očištěn. To znamená odstranit nadbytečné mezery, které uživatel mohl zadat i omylem, nebo také proto, aby přechytračil podmínky formuláře. I takové věci se dají dělat regulárními výrazy.

C# má pro účely čištění metodu Trim().

Metoda Trim() implicitně odstraňuje bílé znaky, ale můžeme ji přidat i jiné znaky. Metoda Trim() pracuje na začátku a na konci řetězce.

Regulární výrazy prochází celým řetězcem.

Regulární výrazy

Regulární výraz, neboli regex, je textový řetězec složený z určitých znaků. 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 si ukážeme 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.

Pojďme si vysvětlit význam jednotlivých částí.

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

Seznámíme se s kvantifikátory a zástupnými znaky. Uvedeme si také nějaké další konstrukce.

Kvantifikátory

Kvantifikátory nám říkají kolikrát se budou znaky opakovat.

Kvantifikátorů je několik typů, například:

  • {X}, kde X udává počet opakování,
  • {X, Y}, kde X je minimální a Y maximální počet opakování,
  • předdefinované kvantifikátory.

Příklad čtyř libovolných znaků bychom tedy zapsali například takto:

^.{4}$

Vypišme si kvantifikátory do tabulky:

Znak Význam
. jeden libovolný znak
* žádný nebo více znaků
+ jeden nebo více znaků
? žádný nebo jeden znak
{X} X znaků
{X,} X a více znaků
{X,Y} Mezi X a Y znaky

Složené závorky nám seskupují určitou část výrazu. Kvantifikátory se vztahují na celý obsah závorky.

Otazník ? je alternativou k {0, 1}. Hvězdička * k {0-∞} a plus + k {1-∞}. U předdefinované hvězdičky a pluska to funguje pro maximálně nekonečno.

Ukažme si funkcionalitu kvantifikátoru ., který nahrazuje libovolný znak. Například pro výraz .... bude platit cokoliv, co má čtyři znaky:

Cdf = neplatné

Ahoj = platné

A@x9 = platné

A@x9O = platné

Jak je možné, že výraz A@x9O obsahující pět znaků je platný pro výraz ....? Ukažme si postup vyhodnocení:

  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 zatím splněn.
  5. Žádný další znak ve výrazu, výraz byl splněn.

Řetězce jsou ověřovány tak, zda obsahují regulární výraz.

Pokud řetězec obsahuje něco navíc, projde stejně. Řešení tohoto problému je však snadné. Jednoduše před výraz přidáme stříšku ^ ( AltGr + 94), která zajistí, že na začátku řetězce bude testovaný text. Za výraz dáme dolar $ (AltGr + ů).

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. Znaky ^ a $ si probereme níže v dalších konstrukcích.

Zástupné znaky

Zástupné znaky zkracují výraz a nahrazují nějaký znak nebo konstrukci:

Znak Význam
\s zahrnuje neviditelné znaky
\S zahrnuje viditelné znaky
\d číslice
\D jiný než číslice
\w jakékoliv písmeno, číslo nebo podtržítko
\W jiný než slovo (mezera, diakritika aj.)

\d jsou čísla 0-9, tedy výraz je totožný s výrazem [0-9]. Výraz \D je totožný s výrazem [^0-9].

Další konstrukce

Nakonec se podíváme na některé další konstrukce:

Znak Význam
abc řetězec abc
[abc] jeden ze znaků a, b, c
[^abc] jeden znak kromě a, b, c (negace)
[a-z] malá písmena
[A-Z] velká písmena
[^A-Za-z0-9] symbol (cokoliv kromě písmena a čísla)
^abc abc na začátku řetězce
abc$ abc na konci řetězce
^abc$ celý řetězec musí být abc

Stříška ^ označuje začátek řetězce. Dolar $ pak jeho konec.

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 ^ (Alt + 94).

Pokud chceme určit, že se má ověřovat třeba abeceda, tak uvedeme [a-zA-z]. Tímto zajistíme, že se zkontrolují všechny znaky, které jsou mezi a-z a A-Z. Znaky se berou z ASCII tabulky, takže třeba č už daný výraz nesplní.

Escapování

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

\(ahoj\|světe\)

 

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