我有一个带有占位符的文本模板,为了用实值替换占位符,我会解析它。
文本模板:
Name:%name%
Age:%age%我使用StringBuilder.Replace()替换占位符
sb.Replace("%name%", Person.Name);现在我想做更先进的算法。有些代码行是有条件的。它们要么被完全移除,要么被完全保存。
文本模板
Name:%Name%
Age:%age%
Employer:%employer%只有雇用人员时才应出现行雇主(由布尔变量Person.IsEmployed控制)。
更新:I可以使用打开/关闭标记。如何在字符串A和B之间找到文本?我能用Regex吗?多么?
发布于 2010-03-07 08:50:16
您当前的模板方案不够健壮--您应该添加更多的特殊占位符,例如:
Name:%Name%
Age:%age%
[if IsEmployed]
Employer:%employer%
[/if]您可以使用regex解析if *块(未测试):
Match[] ifblocks = Regex.Match(input, "\\[if ([a-zA-Z0-9]+)\\]([^\\[]*)\\[/if\\]");
foreach(Match m in ifblocks) {
string originalBlockText = m.Groups[0];
string propertyToCheck = m.Groups[1];
string templateString = m.Groups[2];
// check the property that corresponds to the keyword, i.e. "IsEmployed"
// if it's true, do the normal replacement on the templateString
// and then replace the originalBlockText with the "filled" templateString
// else, just don't write anything out
}但实际上,这个实现充满了漏洞.使用模板框架可能会更好,就像建议的另一个答案一样。
发布于 2010-03-07 08:28:59
也许您可以在替换文本中添加"Employer:“标签,而不是模板:
模板:
Name:%Name%
Age:%age%
%employer%替换
sb.Replace("%employer%",
string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer)发布于 2010-03-07 08:40:07
另一种选择可能是使用模板引擎,如火花或NVelocity。
参见火花在这里的快速示例
一个成熟的模板引擎应该给您对格式化输出的最大控制权。例如,条件词和重复部分。
https://stackoverflow.com/questions/2395621
复制相似问题