在c#2.0中解析字符串模板的最佳方法

时间:2012-12-05 10:20:06

标签: c# templates template-engine

这是我的pesudo模板

Dear {User},

Your job finished at {FinishTime} and your file is available for download at {FileURL}.

Regards,

{Signature}

我在c#中搜索Google进行模板解析,找到了几个好的库,但这些库完全用于c 4.0版本。我正在使用c#v2.0。所以任何人都可以建议我使用任何好的库来解析c#v2.0的字符串模板。只是简单地讨论在c#2.0中解析字符串模板的最佳和简单的方法。感谢

我使用RegEx

获得了一个简单的解决方案
string template = "Some @@Foo@@ text in a @@Bar@@ template";
StringDictionary data = new StringDictionary();
data.Add("foo", "random");
data.Add("bar", "regex");
string result = Regex.Replace(template, @"@@([^@]+)@@", delegate(Match match)
{
    string key = match.Groups[1].Value;
    return data[key];
});

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

class Program {
static void Main() {
    var template = " @@3@@  @@2@@ @@__@@ @@Test ZZ@@";
    var replacement = new Dictionary<string, string> {
            {"1", "Value 1"},
            {"2", "Value 2"},
            {"Test ZZ", "Value 3"},
        };
    var r = new Regex("@@(?<name>.+?)@@");
    var result = r.Replace(template, m => {
        var key = m.Groups["name"].Value;
        string val;
        if (replacement.TryGetValue(key, out val))
            return val;
        else
            return m.Value;
    });
    Console.WriteLine(result);
 }
 }

4 个答案:

答案 0 :(得分:2)

为什么你不能只使用string.format?将模板更改为:

Dear {0},

Your job finished at {1} and your file is available for download at {2}.

Regards,

{3}

并使用此:

string.format(template, user, finishTime, filepath, signature);

没有

答案 1 :(得分:0)

这可能太简单了,但对于这类任务,我总是在C#中使用String.Replace

答案 2 :(得分:0)

最简单的选择是在指定符上进行字符串替换。但是问题是你必须事先知道说明符。

更复杂的过程是将模板作为字符串读入并对其进行标记。您处理每个字符并发出解析器可以使用的标记。你真的很少,你有正常的字符串字符,一些空白字符和你的令牌开始/结束对。

您希望继续搅动标记,直到您到达说明符开始标记,然后记录所有内容,直到说明符结束标记作为标记名称。冲洗并重复,直到您处理完所有发出的令牌。

一旦你解析了你的说明符集合,你就可以简单地对它们进行字符串替换,就像最初的想法一样。或者,如果您在字符串中记录了说明符所在的位置,即偏移量和长度,您可以简单地剪切并插入替换值。

答案 3 :(得分:0)

您是否考虑过使用string.Format - 例如:

string template = @"Dear {0}, Your job finished at {1} and your file is available for download at {2}. Regards, {3}";

string output = string.Format(template, user, finishTime, fileUrl, signature);