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