Saturday, January 9, 2010

RegexMatchEvaluator

RegexMatchEvaluator
RegexMatchEvaluator stellt eine Erweiterung der Regex-Methode Replace dar.
Um den RegexMatchEvaluator zu verwenden, benötigt man eine Instanz von MatchEvaluator. Diese Klasse befindet sich im gleichen Namespace wie Regex und wird folgendermaßen instanziert:

MatchEvaluator myEvaluator = new MatchEvaluator([Methode]);



Außerdem braucht man eine Methode mit einem String als Rückgabewert:



C#-Code:



public string ReplaceMatch(Match m)
{
[IF-Anweisungen]
return [Ersetzung];
}



(Sollten Sie dieses Beispiel in einer Konsolenanwendung ausprobieren, so fügen Sie im Methodenkopf vor „string“ das Schlüsselwort static ein.)

Den Parameter [Methode] bei der Instanzierung ersetzt man in diesem Beispiel mit ReplaceMatch, da dies der Name der Methode mit String-Rückgabe ist.


Das Pattern, das wir bisher dem Regex-Konstruktor bekannt gegeben haben, wird erst jetzt der Replace-Methode übergeben. Das Ersetzen mit der statischen Replace-Methode sieht allgemein so aus:



C#-Code:



string [Variablenname] = Regex.Replace([Zu ersetzender String], [Pattern], [MatchEvaluator-Instanz]);



Beispiel:

In diesem einfachen Beispiel werden alle Beistriche durch eine leere Zeichenkette ("") ersetzt. Da der Ersatzstring unabhängig vom Treffer gleich bleibt, ist in diesem Fall die Verwendung von MatchEvaluator nicht besonders sinnvoll, denn die gleiche Aufgabe ließe sich auch einfacher mit der Replace-Methode durchführen.



C#-Code:



MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceMatch);

string output = Regex.Replace("H,a,l,l,o", ",", myEvaluator);



Und die Methode:



C#-Code:



public string ReplaceMatch(Match m)

{


return "";


}



Die Variable output würde „Hallo“ enthalten, da von der Methode ReplaceMatch jeder gefundene Beistrich mit einer leeren Zeichenkette ersetzt wird.

Lösung mit der Replace-Methode von Regex:



C#-Code:



Regex.Replace("H,a,l,l,o", ",", "");



(Allgemein:



C#-Code:



Regex.Replace([ZuErsetzen], [Pattern], [Ersatz]);



)

Sinnvoll wird der MatchEvaluator, wenn wir Suchtreffer mit einem flexiblen String ersetzen möchten.


Beispiel:


- Ziel: Wir wollen alle „ae“ zum Umlaut „ä“, alle „oe“ zu … umwandeln


- Wir erstellen eine Instanz von MatchEvaluator mit dem Namen myEvaluator und übergeben dem Konstruktor den Namen der folgenden Methode:


- Methode:



C#-Code:



public string ReplaceMethode(Match m)
{
switch (m.Value)
{
case "ae":
return "ä";
case "oe":
return "ö";
case "ue":
return "ü";
case "Ae":
return "Ä";
case "Oe":
return "Ö";
case "Ue":
return "Ü";
default:
return "";
}
}



(Den default-Zweig im Switch-Case-Konstrukt brauchen wir, damit alle Codepfade einen Wert zurückgeben, wie es der Compiler haben will.)

- Durchführen der Ersetzung mit der Replace-Methode (Pattern: [aou]e):


string ersetzterString = myRegex.Replace("Franz faehrt von Muenchen nach Oesterreich, um einen Baer zu suchen.", "[aou]e", myEvaluator, RegexOptions.IgnoreCase);


- String nach der Ersetzung: Franz fährt von München nach Österreich, um einen Bär zu suchen.


- Erklärung: Alle ae, oe und ue im String werden je nach Treffer mit ä, ö oder ü ersetzt. Aufgrund von RegexOptions.CaseInsensitive trifft Regex auch Ae, Oe und Ue. (Bei jedem Treffer (Match) wird die Methode ReplaceMethode aufgerufen und der Treffer mit dem Rückgabewert der Methode ersetzt.)


(Weitere sinnvolle Ersetzungen wären, dass die Klasse, in der sich die Methode befindet, eine statische Int-Variable mit dem Ausgangswert 0 enthält. Diese Variable wird bei jedem Aufruf der Methode inkrementiert (um den Wert 1 erhöht) und als Ersetzungsstring zurückgegeben. Siehe: http://msdn2.microsoft.com/de-de/library...tor(VS.80).aspx)

No comments:

Post a Comment

 
Blogverzeichnis - Blog Verzeichnis bloggerei.de Blog Suche