0

这是我的伪模板

Dear {User},

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

Regards,

{Signature}

我在 Google 中搜索 c# 中的模板解析,发现了几个不错的库,但这些库完全适用于 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

4 回答 4

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

不?

于 2012-12-05T10:24:52.337 回答
0

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

于 2012-12-05T10:25:01.493 回答
0

最简单的选择是只对说明符进行字符串替换。但是这里的问题是您必须事先知道说明符。

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

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

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

于 2012-12-05T10:25:21.930 回答
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);
于 2012-12-05T10:28:46.737 回答