niedziela, 20 lipca 2008

Wyrażenia regularne w C# - podmiana

Wyrażenia regularne pozwalają także na podmianę tekstu na podstawie podanych wzorców. Klasa Regex posiada metodę Replace umożliwiającą podmianę tekstu.
Najprostszy sposób to wywołanie metody, której argumentami są: ciąg wejściowy, wzorzec oraz ciąg, który zostanie użyty do podmiany.


string tekst = "Ala mz kota, a kot mw Ale";
string podmiana = Regex.Replace(tekst, "m.", "ma"); // podmień tekst rozpoczynający się od m i kończący się dowolnym znakiem
Console.WriteLine(podmiana); // wyświetlenie podmienionego tekstu


Bardziej rozbudowana wersja tej metody pozwala na zastosowanie delegatów wywoływanych w momencie dopasowania do wzorca.


class Program
{
private static string ReplaceMethod(Match m)
{
Console.WriteLine(m.Value); // znaleziony tekst
return "ma"; // zwrócenie tekstu który znajdzie się w miejscu dopasowania
}

static void Main(string[] args)
{
string tekst = "Ala mz kota, a kot mw Ale";
string podmiana = Regex.Replace(tekst, "m.", ReplaceMethod);
Console.WriteLine(podmiana);
Console.ReadKey();
}
}

wtorek, 8 lipca 2008

Wyrażenia regularne w C#

Wyrażenia regularne to podstawowe narzędzie przy analizie i modyfikacji tekstu. C# też oferuje odpowiednią klasę do używania wyrażeń regularnych. Mowa tu o klasie Regex.
Klasy można używać w dwojaki sposób, tworząc obiekty tej klasy lub też korzystać ze statycznych metod. W tych dwóch przypadkach, postępuje się w podobny sposób.

Wyszukiwanie tekstu

Klasa Regex posiada dwie metody posiadające kilka innych wariantów: Match i Matches. Pierwsza z nich zwraca jedynie pierwszy wynik wyszukiwania w postaci obiektu klasy Match.

string tekst = "Ala ma kota, a kot ma Ale";
Match match = Regex.Match(tekst,"kot.?");
while (match.Success) // czy zostało coś znalezione
{
Console.WriteLine(match.Value); // Wyświetlenie wyniku wyszukiwanie
match = match.NextMatch(); // odczytanie następnego wyniku
}

W powyższym przykładzie zastosowana została metoda Match, która zwraca pojedynczy wynik oraz metoda NextMatch(), która zwraca kolejny. Można pobrać całą kolekcję wyników przy pomocy metody Matches.

string tekst = "Ala ma kota, a kot ma Ale";
MatchCollection matches = Regex.Matches(tekst, "kot.?");
foreach (Match m in matches)
{
Console.WriteLine(m.Value);
}