4

我有一个带有占位符的文本模板,我解析它以便用实际值替换占位符。

文本模板:

Name:%name%
Age:%age%

我使用 StringBuilder.Replace() 替换占位符

sb.Replace("%name%", Person.Name);

现在我想做更高级的算法。有些代码行是有条件的。它们必须要么完全删除,要么保留。

文本模板

Name:%Name%
Age:%age%
Employer:%employer%

Employer 行应仅在雇用人员时出现(由布尔变量 Person.IsEmployed 控制)。

更新:我可以使用打开/关闭标签。如何在字符串 A 和 B 之间找到文本?我可以使用正则表达式吗?如何?

4

4 回答 4

4

也许您可以在替换文本而不是模板中包含标签“雇主:”:

模板:

Name:%Name%
Age:%age%
%employer%

替换

sb.Replace("%employer%", 
    string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer)
于 2010-03-07T08:28:59.440 回答
2

另一种选择可能是使用模板引擎,例如SparkNVelocity

在此处查看Spark的快速示例

一个成熟的模板引擎应该让您对格式化输出有最大的控制。例如条件句和重复部分。

于 2010-03-07T08:40:07.640 回答
1

一种选择是像现在一样进行所有替换,然后在出门时使用 RegEx 替换来修复空变量。像这样的东西:

Response.Write(RegEx.Replace(sb.ToString(), "\r\n[^:]+:r\n", "\r\n"));
于 2010-03-07T08:35:18.603 回答
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
}

但是,实际上,此实现充满了漏洞……使用模板框架可能会更好,例如建议的另一个答案。

于 2010-03-07T08:50:16.777 回答