Professional Documents
Culture Documents
platformie .NET
v1.1
Miosz Orze
Celem artykuu jest zapoznanie Czytelnika z podstawowymi elementami skadni wyrae regularnych
oraz sposobami ich wykorzystania na platformie .NET. Postaram si zachci tych, ktrzy jeszcze nie
mieli do czynienia z tym tematem do poznania tego potnego narzdzia.
[^abc]
[a-z0-9]
\w
\W
\s
\S
\d
\D
$
\b
\B
{n}
Dokadnie n razy.
{n,}
Minimum n razy.
{n,m}
+?
??
{n,}?
{n,m}?
\u0020
()
Nazwa, ktr sprawdzamy jest podawana jako parametr, a jej format jest okrelany przez wyraenie
pobierane z komponentu TextBox. Znaczenie Regex.IsMatch() oraz RegexOptions.IgnoreCase omwi
dokadnie w dalszej czci artykuu. Pamitaj, e podawane przez uytkownika wyraenie moe by
nieprawidowe i wwczas generowany jest wyjtek (jest on jednak obsugiwany w innym punkcie kodu). Oto prawidowe wyraenie testujce nazw: ^[d-z]_\d{3}_(xyz|pki)_\d{2}_\w{2,7}.sql$
Dla porwnania metoda sprawdzajca poprawno nazwy bez zastosowania RE wyglda tak:
private bool CzyNazwaPoprawnaSadoMaso(string nazwa)
{
try
{
if (nazwa[0] == 'a' || nazwa[0] == 'b' || nazwa[0] == 'c' ||
!Char.IsLetter(nazwa[0]))
{
return false;
}
if (nazwa[1] != '_')
{
return false;
}
if (!Char.IsDigit(nazwa[2]) || !Char.IsDigit(nazwa[3]) ||
!Char.IsDigit(nazwa[4]))
{
return false;
}
if (nazwa[5] != '_')
{
return false;
}
if (nazwa.Substring(6, 3) != "xyz" && nazwa.Substring(6, 3) != "pki")
{
return false;
}
if (nazwa[9] != '_')
{
return false;
}
if (!Char.IsDigit(nazwa[10]) || !Char.IsDigit(nazwa[11]))
{
return false;
}
if (nazwa[12] != '_')
{
return false;
}
if (nazwa.IndexOf('.', 13) - 13 < 2 || nazwa.IndexOf('.', 13) - 13 > 7)
{
return false;
}
else
{
string s = nazwa.Substring(13, nazwa.IndexOf('.', 13) - 13);
foreach (char i in s)
{
if (!Char.IsLetter(i))
{
return false;
}
}
}
if (nazwa.Substring(nazwa.Length - 4) != ".sql")
{
return false;
}
}
catch
{
return false;
}
// Jeli wykonanie dojdzie do tego punktu mona przyj, ze nazwa jest
// prawidowa.
return true;
}
uywa prekompilowanych wyrae regularnych (zapisanych w DLL), to eliminuje konieczno kompilacji po uruchomieniu programu.
Poniewa celem artykuu jest zapoznanie Czytelnika z podstawami RE i zachcenie go do dalszej nauki
przedstawi jedynie najpotrzebniejsze elementy trzech najbardziej przydatnych klas: Regex, Match
oraz MatchCollection. Po peniejszy opis tych a take innych klas takich jak Group czy Capture odsyam
do dokumentacji .NET (opisuje te zagadnienia w przystpny sposb).
Zanim zaczniemy warto wspomnie o problemie zwanym plag backslashy. O co chodzi? W wyraeniach regularnych znak \ ma specjalne znaczenie. eby zlikwidowa to specjalne znaczenie naley ten
znak podwoi. Niestety w stringach w C# backslash te ma specjalne znaczenie. W celu pozbycia si
tego znaczenia naley ten znak... podwoi. W taki sposb by zapisa jeden backslash w wyraeniu
trzeba by uy w stringu a czterech! Na szczcie projektanci C# wprowadzili do jzyka stringi
dosowne. Aby zlikwidowa specjaln interpretacj znakw w acuchu wystarczy poprzedzi go znakiem @. Np. @"\n" nie oznacza wcale nowej linii tylko napis \n. Oczywicie jeli chcemy zapisa w
wyraeniu znak \ musimy go podwoi (tego wymaga bowiem skadnia wyrae regularnych). Napiszemy wic tak: @"\\", na pewno wyglda to lepiej ni zapis: "\\\\".
Przykad:
Uycie metody obiektu do sprawdzenia czy w stringu znajduje si sowo zaczynajce si na liter a.
Regex re = new Regex(@"\ba\w*");
Console.WriteLine(re.IsMatch("trawa agrest")); // True
ECMAScript
ExplicitCapture
IgnoreCase
IgnorePatternWhitespace
None
Eliminuje z wyraenia biae znaki i w ten sposb umoliwia zwikszenie czytelnoci oraz stosowanie # komentarzy
Sprawia, e ^ oraz $ odnosz si rwnie do pocztku i koca linii.*
Oznacza, e nie okrelono opcji.
RightToLeft
Singleline
Multiline
W celu uycia opcji podajemy je jako parametr przy tworzeniu obiektu lub korzystaniu z metod statycznych.
Do poczenia kilku opcji stosujemy operator | (alternatywa bitowa).
Przykad:
Wykorzystanie opcji IgnoreCase i Multiline:
Regex re = new Regex(@"\ba\w*", RegexOptions.IgnoreCase | RegexOptions.Multiline);
Wynik:
Uderzy go kotletem!
Podobny efekt mona otrzyma korzystajc z metody Split() klasy Regex. W przypadku uycia tej metody tekst zostanie podzielony zgodnie z wystpieniem dopasowania.
Przykad:
Stworzenie tablicy, ktrej pierwszy element bdzie zawiera nazw zmiennej a drugi jej warto (zakadamy, e s one rozdzielone pascalowym operatorem przypisania wraz ze spacjami):
string[] s = Regex.Split("X := 1234", " := ");
Jeli zastosujemy wyraenie regularne, ktre moe dopasowa pusty tekst, wwczas w wyniku uycia
Regex.Split() otrzymamy tablic pojedynczych znakw. Stanie si tak dlatego, e pusty string moemy
odnale w kadym punkcie badanego acucha. Dodatkowo oprcz znakw, ktre wystpiy w badanym tekcie, na pocztku i na kocu tablicy wystpi pusty string.
Przykad:
Kod tworzcy picioelementow tablic:
string[] s = Regex.Split("123", "a*");
Jeli w tekcie jest wicej ni jedno dopasowanie obiekt zwrcony przez RegEx.Match() odnosi si do
pierwszego z nich.
Wynik:
Znaleziono: 3
agrest 6 5
ameba 5 12
analogia 8 30
wiczenia.
Nie mona nauczy si wyrae regularnych przez samo patrzenie na ich pogmatwan skadnie. Naley
nieco potrenowa. Do wicze wykorzystamy darmowy program Rad Software Regular Expression Designer 1.2 (wymaga NET 1.1). Mona te skorzysta z darmowego The Regulatora lub sharewareowego Expresso.
Program mona pobra z tej strony: http://www.radsoftware.com.au/regexdesigner
Regular Expression Designer jest bardzo prosty w obsudze, nie zaszkodzi jednak may opis tego do
czego su poszczeglne okna.
1.2
Zauwa, e dom dopasowuje rwnie tekst bdcy czci sowa domniemanym. Aby wyraenie akceptowao jedynie dom bdcy osobnym sowem naley zmieni nieco wyraenie przez uycie asercji \b,
ktra oznacza koniec lub pocztek sowa.
Wyraenie: \bdom\b
Teraz cig znakw w sowie domniemanym si nie zaapa.
wiczenie 2.
Tekst:
a\aplikacja
a10 a_x
Afganistan
bilon
kompilator
2.1
Wyraenie: a.
Takie wyraenie dopasuje kady cig symboli skadajcy si z litery a, po ktrej nastpuje dowolny
symbol. Kropka oznacza cokolwiek z wyjtkiem znaku nowej linii lub wszystko bez wyjtku (jeli ustawiona jest opcja Singleline).
2.2
Wyraenie: a.*
Tym razem na kocu wyraenia jest gwiazdka, ktra mwi, e dowolny znak (wyznaczony przez kropk) moe powtrzy si zero lub wicej razy.
2.3
Wyraenie: a\d+
Teraz jedyne dopasowanie to a10. Dlaczego? Poniewa po literze a ma wystpi co najmniej jedna
cyfra.
2.4
Wyraenie: a\d*
Wystarczy, e zmienimy kwantyfikator + (jeden lub wicej razy) na * (zero lub wicej razy) a wynik
dopasowania jest diametralnie inny. Tym razem zaapi si wszystkie pojedyncze litery a oraz cig
a10.
wiczenie 3.
Tekst:
00_233 00-999 34-700 34-99d 433-234
3.1
Wyraenie: \d{2}-\d{3}
To wyraenie sprawdza poprawno kodu pocztowego. Szuka dwch cyfr, potem rednika a na koniec
znowu trzech cyfr. Czy jednak na pewno to regex dziaa jak naley?
3.2
Wyraenie: \b\d{2}-\d{3}\b
Poprzednia regua miaa istoty bd. Akceptowaa te cze tekstu 433-234. Dziki uyciu \b na pocztku i na kocu wyraenia likwidujemy ten problem.
wiczenie 4.
Tekst:
14.12.1924 Jan Kowalski
02.01.1999 Stefan mietana
7.2
Wyraenie: a(na)?
Umieszczajc cig na w nawiasach okrelamy, e cay cig na moe wystpi zero lub jeden raz.
Podobnie moemy uy nawiasw z kadym innym kwantyfikatorem, np. z * Jeli nie masz wczonej
opcji ExplicitCapture w oknie z dopasowaniami pojawiy si elementy z klas Group i Capture (ich omwienie wykracza poza ramy tego artykuu).
wiczenie 8.
Tekst:
sysdm.cpl
examplefile.html
boot.ini
services.msc
8.1
Wyraenie: \b\w{1,8}\.\w{3}\b
Za pomoc tej reguy sprawdzamy czy nazwa ma format 8.3. Najpierw oznaczamy, e ma wystpi od
1 do 8 znakw z klasy word (z ktrych pierwszy znajduje si na granicy sowa). Potem ma wystpi
kropka (dosownie kropka wic poprzedzilimy j znakiem ucieczki \). Na koniec maj wystpi dokadnie 3 znaki z klasy word.
8.2
Wyraenie:
\b # granica slowa
\w{1,8} # od 1 do 8 znakow
\. # kropka
\w{3} # 3 znaki
\b # granica slowa
Aby mc skorzysta z takiej formy wyraenia regularnego musisz ustawi opcj IgnorePatternWhitespace. Jej ogromn zalet jest to, e moemy tworzy komentarze przy uyciu znaku #.
wiczenie 9.
Tekst:
kot dom kotwica domowa
GetPrice
9.1
Wyraenie: kot|dom
Ta regua dopasowuje wszystkie wystpienia cigu kot lub dom.
9.2
Wyraenie: \b(kot|dom)\b
Za pomoc tego wyraenie znajdziemy wszystkie sowa kot lub dom. W odrnieniu od punktu 9.1
cze kot w sowie kotwica nie zostanie dopasowana. Koniecznie sprawd jak zmieni si dziaanie wyraenia po usuniciu nawiasw.
9.3
Wyraenie: Get|GetPrice
Tym razem jedyne dopasowanie to Get.
9.4
Wyraenie: GetPrice|Get
Ta regua zwraca rwnie jedno dopasowanie, ale tym razem jest to cig GetPrice. Wniosek? Kolejno
elementw w alternatywie ma znaczenie! Wyraenie regularne przestaje szuka kolejnego dopasowania gdy znajdzie ju dopasowanie do jakiego czonu alternatywy.
wiczenie 10.
Tekst:
babaa barka banan
10.1
Wyraenie: b\w+
Zastosowalimy zachann wersj kwantyfikatora + wic wyraenie szuka najduszego moliwego dopasowania.
10.2
Wyraenie: b\w+?
Tym razem zmienilimy kwantyfikator na leniwy wic wyraenie dopasuje jak najkrtszy tekst, ktry
pasuje do wzorca (w tym przypadku bdzie to litera b i jeden znak z klasy word).
wiczenie 11.
Tekst:
to chyba
jest jaka
szansa
11.1
Wyraenie: \b\w*\w$
Jeli mamy wyczon opcje Multiline powinno zosta dopasowane jedynie sowo: szansa. Jest tak dlatego, e symbol $ oznacza w tym przypadku koniec tekstu. Co si zmieni gdy ustawimy opcje Multiline? Niestety nic! Jeli masz zainstalowanego Pythona sprbuj jak zadziaa to z programem redemo.py
(jest doczany przy standardowej instalacji w katalogu Tools\Scripts). Ustaw opcje Multiline oraz zaznacz opcje Highlight all matches i przekonaj si, e zostay znalezione trzy dopasowania: chyba, jaka
oraz szansa.
11.2
Wyraenie: \b\w*[\w\r]$
Ustawiamy opcje Mutiline - tym razem udao si nam dopasowa sowa chyba, jaka oraz szansa. Stao
si tak dlatego, e teraz na kocu linii moe znajdowa si znak z klasy word albo znak \r (carriage
return).
Podsumowanie.
Wyraenia regularne s potnym narzdziem, ktre w wielu przypadkach pozwala na tworzenie elastycznego, klarownego i efektywnego kodu. Nie kady programista .NET musi by znawc tego zoonego tematu, ale kady powinien chocia rozumie podstawy ich skadni i sposobu wykorzystania na
platformie .NET Framework. Jeli chcesz zaoszczdzi sobie w przyszoci wiele czasu i nerww zainwestuj jeden lub dwa dni na opanowanie tych podstaw - z pewnoci nie poaujesz!
Jeli masz troch wicej czasu i chci poszerz swoj wiedz na temat RE - zwr szczegln uwag na
takie elementy jak konstrukcje grupujce, wzory zastpowania czy odwoania wstecz...
Kod doczony do artykuu mona pobra z tego adresu:
http://morzel.net/edu/wdre/wdre_src.zip