在大文本模板中替换令牌的最佳方法

时间:2020-03-05 18:41:35  来源:igfitidea点击:

我有一个很大的文本模板,需要将标记化的部分替换为其他文本。令牌看起来像这样:## USERNAME ##。我的第一个本能只是使用String.Replace(),但是有没有更好,更有效的方法,或者Replace()已经为此进行了优化?

解决方案

回答

如果令牌很奇怪以至于我们需要使用正则表达式来找到它们,则可以使用System.Text.RegularExpressions.Regex.Replace()进行查找。

某种灵魂进行了性能测试,并且在Regex.Replace(),String.Replace()和StringBuilder.Replace()和String.Replace()之间居于首位。

回答

string.Replace很好。我更喜欢使用正则表达式,但是对于正则表达式我是***。

要记住的是这些模板的大小。如果确实很大,并且内存是个问题,则可能要创建一个对流起作用的自定义标记生成器。这样,我们在操作文件时仅将其一小部分保存在内存中。

但是,对于幼稚的实现,string.Replace应该很好。

回答

如果对大型字符串进行多次替换,则最好使用StringBuilder.Replace(),因为通常会出现字符串性能问题。

回答

最近不得不做类似的事情。我所做的是:

  • 制作一个采用字典的方法(键=令牌名称,值=我们需要插入的文本)
  • 使用Regex.Matches(input,正则表达式)将所有匹配项与令牌格式(##。+?##在我的情况下,不是很擅长正则表达式:P)匹配
  • 使用字典查找结果,以查找令牌的插入值。
  • 返回结果。

完毕 ;-)

如果我们想测试正则表达式,我可以建议调节器。

回答

这是正则表达式的理想用法。请查看此有用的网站,.Net正则表达式类以及这本非常有用的书"掌握正则表达式"。

回答

我必须要做的唯一情况是发送模板电子邮件。在.NET中,MailDefinition类提供了开箱即用的功能。因此,这就是创建模板化消息的方式:

MailDefinition md = new MailDefinition();
md.BodyFileName = pathToTemplate;
md.From = "[email protected]";

ListDictionary replacements = new ListDictionary();
replacements.Add("<%To%>", someValue);
// continue adding replacements

MailMessage msg = md.CreateMailMessage("[email protected]", replacements, this);

此后,将通过替换模板中的值来创建msg.Body。我想你可以看看带有Reflector的MailDefinition.CreateMailMessage()。抱歉,话题有些偏离,但是如果情况如此,我认为这是最简单的方法。

回答

正则表达式将是编写代码的最快解决方案,但是如果我们有许多不同的标记,那么它将变得更慢。如果性能不是问题,请使用此选项。

更好的方法是定义令牌,例如可以在文本中扫描的" ##"。然后从哈希表中选择要替换的内容,并以令牌后的文本作为键。

如果这是构建脚本的一部分,则nAnt具有出色的功能,称为"过滤链"。该代码是开源的,因此我们可以查看如何快速完成该工作。

回答

好吧,这取决于模板中有多少变量,模板有多少等,这可能是完整模板处理器的工作。我曾经在.NET上使用过的唯一工具是NVelocity,但是我敢肯定那里肯定有很多其他工具,其中大多数都链接到某个Web框架或者另一个Web框架。