如何读取特定标记中包含的字符串并用不同的字符串替换它?

时间:2016-09-08 21:25:01

标签: c# .net c#-4.0

我有一个字符串,有多个地方可以解析< %%>中包含的字符串标签并用适当的值替换它。如果只有一个标签出现,我可以使用IndexOf方法读取字符串,然后使用Replace方法。如何在多次出现标签的情况下做到这一点?感谢您的任何建议。

示例:

  
    

阅读text1<%GetName%>阅读text2<%GetID%>阅读tex3<%GetNumber%>还有更多

  

输出应为

  
    

读取text1 Value1读取text2 Value2读取text3 Value3

  

3 个答案:

答案 0 :(得分:3)

您可以考虑使用正则表达式 - 特别是Regex.Replace方法

你需要的正则表达式如下:

<%([^%]+)%>

使用MatchEvaluator,您可以根据匹配项替换整个字符串:

var newText = Regex.Replace(textToCheck, "<%([^%]+)%>", (m) => {
    switch (m.Groups[1].Value)
    {
        case "GetName":
            return "New value";
        ...
    }
});

答案 1 :(得分:3)

您可以使用正则表达式和字典来映射值.....

var toReplace = new Dictionary<string, string>()
{
    {"GetName", "Value1" },
    {"GetID", "Value2" },
    {"GetNumber", "Value3" },
};

string input = @"Read text1 <%GetName%> Read text2 <%GetID%> Read tex3 <%GetNumber%> and more";
var output = Regex.Replace(input, @"<%(.+?)%>", m => toReplace[m.Groups[1].Value]);

输出:

Read text1 Value1 Read text2 Value2 Read tex3 Value3 and more

答案 2 :(得分:1)

使用字典将正则表达式替换为将模板参数映射到值以替换给定字符串模板中的值:

public static class StringTemplatingExtensions
{
    public static string ParseTemplate(this string template, IDictionary<string, object> valueMap)
    {
        foreach(var pair in valueMap)
        {
            template = template.Replace($"<%{pair.Key}%>", pair.Value.ToString());
        }

        return template;
    }
}

所以可以按如下方式使用:

var template = "Read text1 <%GetName%> Read text2 <%GetID%> Read tex3 <%GetNumber%>";
var parsed = template.ParseTemplate(new Dictionary<string, object> {
    { "GetName", "Matías" },
    { "GetID", "114894" },
    { "GetNumber", "282893" }
});

请注意,此解决方案不如其他解决方案灵活,因为它不支持<% VARIABLE %><%VARIABLE %>,而只支持<%VARIABLE%>(不含空格)。顺便说一句,这是一种非常简单但有效的方式来实现您的要求,它只是有效!