首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文本解析,条件文本

文本解析,条件文本
EN

Stack Overflow用户
提问于 2010-03-07 08:20:57
回答 4查看 1.1K关注 0票数 4

我有一个带有占位符的文本模板,为了用实值替换占位符,我会解析它。

文本模板:

代码语言:javascript
复制
Name:%name%
Age:%age%

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

代码语言:javascript
复制
sb.Replace("%name%", Person.Name);

现在我想做更先进的算法。有些代码行是有条件的。它们要么被完全移除,要么被完全保存。

文本模板

代码语言:javascript
复制
Name:%Name%
Age:%age%
Employer:%employer%

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

更新:I可以使用打开/关闭标记。如何在字符串A和B之间找到文本?我能用Regex吗?多么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-07 08:50:16

您当前的模板方案不够健壮--您应该添加更多的特殊占位符,例如:

代码语言:javascript
复制
Name:%Name%
Age:%age%
[if IsEmployed]
Employer:%employer%
[/if]

您可以使用regex解析if *块(未测试):

代码语言:javascript
复制
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
}

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

票数 1
EN

Stack Overflow用户

发布于 2010-03-07 08:28:59

也许您可以在替换文本中添加"Employer:“标签,而不是模板:

模板:

代码语言:javascript
复制
Name:%Name%
Age:%age%
%employer%

替换

代码语言:javascript
复制
sb.Replace("%employer%", 
    string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer)
票数 4
EN

Stack Overflow用户

发布于 2010-03-07 08:40:07

另一种选择可能是使用模板引擎,如火花NVelocity

参见火花在这里的快速示例

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2395621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档