我有一个带有placehoders的文本模板,我将其解析以替换占位符 有实际价值。
文字模板:
Name:%name%
Age:%age%
我使用StringBuilder.Replace()来替换占位符
sb.Replace("%name%", Person.Name);
现在我想制作更高级的算法。一些代码行是有条件的。他们 必须完全删除保留。
文字模板
Name:%Name%
Age:%age%
Employer:%employer%
雇主应该只在雇用人员时出现(由布尔变量Person.IsEmployed控制)。
更新:我可以使用开启/关闭代码。如何在字符串A和B之间找到文本? 我可以使用正则表达式吗?怎么样?
答案 0 :(得分:4)
也许您可以在替换文本中包含标签“雇主:”而不是模板:
模板:
Name:%Name%
Age:%age%
%employer%
替换
sb.Replace("%employer%",
string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer)
答案 1 :(得分:2)
答案 2 :(得分:1)
一种选择是在您现在正在进行所有替换,然后在出门的路上使用RegEx替换来修复空变量。像这样:
Response.Write(RegEx.Replace(sb.ToString(), "\r\n[^:]+:r\n", "\r\n"));
答案 3 :(得分:1)
您当前的模板方案不够健壮 - 您应该添加更多特殊占位符,例如:
Name:%Name%
Age:%age%
[if IsEmployed]
Employer:%employer%
[/if]
您可以使用正则表达式解析[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
}
但是,实际上,这个实现充满了漏洞...你可能会更好地使用模板框架,就像建议的另一个答案一样。