c#中一个更好的替换标签的方法

本文关键字:更好 替换 标签 方法 一个 | 更新日期: 2023-09-27 18:15:32

我需要一个更好的方法来做到这一点:

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)

c#中一个更好的替换标签的方法

textMessage.Trim()
    .Replace("{birthday}",person.Birthday)
    .Replace("{phone}",person.Phone)
    ...
IDictionary<string, string> replacements = new Dictionary<string, string>();
replacements.Add("{birthday}", person.Birthday);
replacements.Add("{phone}", person.MobilePhone);
...
foreach (string s in replacements.Keys) {
    Regex.Replace(textMessage, s, replacements[s], RegexOptions.None);
}

我更喜欢匹配,说,{word},然后使用一个MatchEvaluator的Replace重载。

那么很容易让字典(或开关或其他)提供替代输入(对于给定的"单词")。

还有其他优点,例如更好的运行时特性(O(n) vs O(k*n)),很好地缩放/允许替换数据分离,并且如果其中一个替换包含{}内容也不会受到影响。

幸福的编码。


我从一个老项目里挖出来的。看起来它甚至可以"理解"格式。YMMV .

/// <summary>
/// Like string.Format but takes "{named}" identifiers with a Dictionary
/// of replacement values.
/// </summary>
/// <param name="format"></param>
/// <param name="replaces"></param>
/// <returns></returns>
public static string Format(string format, IDictionary<string,object> replaces) {
    if (format == null) throw new ArgumentNullException("format");
    if (replaces == null) throw new ArgumentNullException("replaces");
    return Regex.Replace(format, @"{(?<key>'w+)(?:[:](?<keyFormat>[^}]+))?}", (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;
        }
    });
}

当然,以一种更简单的方式(从上面提取,YMMV x2):

var person = GetPerson(); // I love closures
var res = Regex.Replace(input, @"{(?<key>'w+)}", (match) => {
    switch (match.Groups["key"].Value) {
        case "birthday": return person.Birthday;
        // ....
        default: return "";
    }
});