我目前正在构建这个小模板引擎。 它需要一个包含参数模板的字符串,以及填写模板的“标签,值”字典。
在引擎中,我不知道模板中的标签和不会出现的标签。
我目前正在对词典进行迭代(foreach),解析我放在字符串构建器中的字符串,并用模板替换相应的值。
有更有效/便捷的方法吗? 我知道这里的主要缺点是每次完全为每个标签解析stringbuilder,这非常糟糕......
(我也在检查,但不包括在样本中,在我的模板不再包含任何标签的过程之后。它们都以相同的方式格式化:@@ tag @@)
//Dictionary<string, string> tagsValueCorrespondence;
//string template;
StringBuilder outputBuilder = new StringBuilder(template);
foreach (string tag in tagsValueCorrespondence.Keys)
{
outputBuilder.Replace(tag, tagsValueCorrespondence[tag]);
}
template = outputBuilder.ToString();
对策:
@Marc:
string template = "Some @@foobar@@ text in a @@bar@@ template";
StringDictionary data = new StringDictionary();
data.Add("foo", "value1");
data.Add("bar", "value2");
data.Add("foo2bar", "value3");
输出:“value2模板中的某些文字”
而不是:“有些@@ foobar @@ text in value2模板”
答案 0 :(得分:1)
正则表达式和MatchEvaluator怎么样?像这样:
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];
});
答案 1 :(得分:0)
以下是您可以用作起点的示例代码:
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);
}
}
答案 2 :(得分:0)
您可以将单字符串格式实现修改为接受您的stringdictionary。例如 http://github.com/wallymathieu/cscommon/blob/master/library/StringUtils.cs