Laden...

String.Format(...) Extended

Erstellt von TheBrainiac vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.964 Views
TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 14 Jahren
String.Format(...) Extended

Beschreibung:

Ich habe mir eine kleine Klasse geschrieben, die ähnlich wie String.Format(...) Variablen in einem Text ersetzt. Zusätzlich dazu kann meine Klasse aber auch mit Funktionen umgehen. Anders als bei String.Format(...) werden Variablen in meinem Snippet benannt (und nicht nur durchnummeriert).

Variablen:
"foo = $foo": Die Variable $foo wird durch ihren entsprechenden Wert ersetzt.

Funktionen:
"$(IF $condition 'Wert für True' 'Wert für False')": Die Variable $condition wird durch ihren entsprechenden Wert ersetzt, danach wird die Funktion IF aufgerufen. Ihr werden drei Parameter übergeben (1. Der Wert von $condition, 2. 'Wert für True' und 3. 'Wert für False'). Das Resultat der Funktion wird anstelle des Statement-Textes in den Ergebnis-String eingesetzt.

Wie registriere ich Variablen / Funktionen?
Angenommen, myStringFormatter sei eine Instanz von StringFormatter.

Mittels folgendem Code wird die Funktion REGREPLACE registriert:

myStringFormatter.Functions.Add("REGREPLACE", (args) => Regex.Replace(args[0], args[1], args[2]));

Ein Beispielaufruf würde so aussehen: $(REGREPLACE 'input' 'pattern' 'replace_with')

Die Variable $loggedin wird so registriert:

myStringFormatter.Variables.Add("loggedin", "true");

Fehlerbehandlung
Die Klasse StringFormatter stellt zwei Events zur Fehlerbehandlung zur Verfügung: UnknownFunction und UnknownVariable.

Angenommen, myStringFormatter sei eine Instanz von StringFormatter.

myStringFormatter.UnknownFunction += (s, e) =>
{
    e.ErrorBehaviour = ErrorBehaviour.Ignore;
};

myStringFormatter.UnknownVariable += (s, e) =>
{
    e.ErrorBehaviour = ErrorBehaviour.Replace;
    e.Replacement = e.Identifier;
};

Mittels ErrorBehaviour.Replace wird die Variable/Funktion durch einen e.Replacement ersetzt.

Mittels ErrorBehaviour.Ignore wird die Variable/Funktion durch String.Empty ersetzt

Mittels ErrorBehaviour.Throw, was die Standardeinstellung ist, wird eine Exception erzeugt.

Ein komplexeres Beispiel:

var input = @"Hello, $(IF $loggedIn $username 'Unknown')!
You are $(IF $loggedIn $(IF $(ISMATCH $role '(admin)|(root)') 'a superuser' 'a normal user') 'not registered')!";

var sf = new StringFormatter();

sf.Functions.Add("IF", (args) => Boolean.Parse(args[0]) ? args[1] : args[2]);

sf.Functions.Add("ISMATCH", (args) => Regex.IsMatch(args[0], args[1]).ToString());

sf.Variables.Add("loggedin", "true");
sf.Variables.Add("username", "john_doe");
sf.Variables.Add("role", "root");
                        
Console.WriteLine(sf.Format(input));

Ausgabe wäre:

Hello, john_doe!
You are a superuser!

Wie in der Zeile $(IF $loggedIn $(IF $(ISMATCH $role '(admin)|(root)') 'a superuser' 'a normal user') 'not registered') zu sehen ist, können Funktionen beliebig tief verschachtelt werden.

Schlagwörter: String format formatierung functions funktionen

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`