2 Stimmen

Eine bessere Möglichkeit zum Ersetzen von Tags in c#?

Ich brauche eine bessere Möglichkeit, das zu tun:

Regex.Replace(Regex.Replace(Regex.Replace(Regex.Replace(Regex.Replace(textMessage.Trim(), "{birthday}", person.Birthday, RegexOptions.None), "{phone}", person.MobilePhone, RegexOptions.None), "{email}", person.Email, RegexOptions.None), "{lastname}", person.LastName, RegexOptions.None), "{firstname}", person.FirstName, RegexOptions.None)

6voto

Reza ArabQaeni Punkte 4836
textMessage.Trim()
    .Replace("{birthday}", person.Geburtstag)
    .Replace("{phone}", person.Telefon)
    ...

3voto

jzila Punkte 724
IDictionary ersetzungen = new Dictionary();
ersetzungen.Add("{geburstag}", person.Geburtstag);
ersetzungen.Add("{telefon}", person.Handynummer);
...

foreach (string s in ersetzungen.Keys) {
    Regex.Replace(textNachricht, s, ersetzungen[s], RegexOptions.None);
}

2voto

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 "";
    }
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X