Ich ziehe es vor, auf z. B. {word}
abzustimmen und dann die Replace Überladung zu verwenden, die einen MatchEvaluator benötigt.
Dann ist es einfach, ein Wörterbuch (oder einen switch oder ähnliches) bereitzustellen, das die Eingabe für die gegebene "word" liefert.
Es gibt zusätzliche Vorteile wie bessere Laufzeiteigenschaften (O(n)
vs. O(k*n)
), skaliert gut/ermöglicht die Trennung von Ersatzdaten und ist nicht betroffen, wenn einer der Ersatzteile {}
enthält.
Viel Spaß beim Coden.
Ich habe das aus einem alten Projekt herausgefunden. Es scheint sogar, dass es die Formatierung "versteht". Ihre Meinung kann variieren.
///
/// Ähnlich wie string.Format, aber mit "{benannten}" Bezeichnern und einem Wörterbuch
/// von Ersatzwerten.
///
///
///
///
public static string Format(string format, IDictionary replaces) {
if (format == null) throw new ArgumentNullException("format");
if (replaces == null) throw new ArgumentNullException("replaces");
return Regex.Replace(format, @"{(?\w+)(?:[:](?[^}]+))?}", (match) => {
Object value;
var key = match.Groups["key"].Value;
var keyFormat = match.Groups["keyFormat"].Value;
if (replaces.TryGetValue(key, out value)) {
if (string.IsNullOrEmpty(keyFormat)) {
return "" + value;
} else {
// format if applicable
return string.Format("{0:" + keyFormat + "}", value);
}
} else {
// don't replace not-found
return match.Value;
}
});
}
Natürlich, in einer eher trivialen Weise (aus oben extrahiert, Ihre Meinung kann variieren x2):
var person = GetPerson(); // Ich liebe Closures
var res = Regex.Replace(input, @"{(?\w+)}", (match) => {
switch (match.Groups["key"].Value) {
case "birthday": return person.Birthday;
// ....
default: return "";
}
});