文本解析,条件文本

时间:2010-03-07 08:20:58

标签: c# stringbuilder text-parsing

我有一个带有placehoders的文本模板,我将其解析以替换占位符 有实际价值。

文字模板:

Name:%name%
Age:%age%

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

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

现在我想制作更高级的算法。一些代码行是有条件的。他们 必须完全删除保留。

文字模板

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

雇主应该只在雇用人员时出现(由布尔变量Person.IsEmployed控制)。

更新:我可以使用开启/关闭代码。如何在字符串A和B之间找到文本? 我可以使用正则表达式吗?怎么样?

4 个答案:

答案 0 :(得分:4)

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

模板:

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

替换

sb.Replace("%employer%", 
    string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer)

答案 1 :(得分:2)

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

查看Spark here

的简单示例

完整的模板引擎应该可以让您最大程度地控制格式化的输出。例如条件和重复部分。

答案 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
}

但是,实际上,这个实现充满了漏洞...你可能会更好地使用模板框架,就像建议的另一个答案一样。