Regulární výrazy v C# .NET - Úvod
V předchozím kvízu, Kvíz - Objektově orientované programování v C#, jsme si ověřili nabyté zkušenosti z kurzu.
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}
, kdeX
udává počet opakování,{X, Y}
, kdeX
je minimální aY
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í:
- 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 zatím splněn.
- Žá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 + 9
+ 4), 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 + 9 + 4).
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\)