2015-01-07 148 views
0

我需要用一个字典中的相应值替换所有占位符,如{text}用字典替换字符串c#

这是我的代码:

var args = new Dictionary<string, string> { 
    {"text1", "name"}, 
    {"text2", "Franco"} 
}; 
saveText(Regex.Replace("Hi, my {text1} is {text2}.", @"\{(\w+)\}", m => args[m.Groups[1].Value])); 

的问题是:如果输入字符串文本不存在于字典,它抛出一个异常,但我宁愿需要以字符串"null"来替换占位符。

+0

你预计该键值可以包含有效的正则表达式的代码?如果确实如此,那么这种正则表达式替换将不起作用。 – Enigmativity

+0

@Enigmativity为什么不呢? –

+0

@LucasTrzesniewski - 尝试在键和输入字符串中用{text.1}替换'{text1}'。 OP代码的结果变成'Hi,my {text.1}是Franco.'。 – Enigmativity

回答

5

只是扩大您的拉姆达:

var args = new Dictionary<string, string> { 
    {"text1", "name"}, 
    {"text2", "Franco"} 
}; 

saveText(Regex.Replace("Hi, my {text1} is {text2}.", @"\{(\w+)\}", m => { 
    string value; 
    return args.TryGetValue(m.Groups[1].Value, out value) ? value : "null"; 
})); 
+0

谢谢,这是我需要的,简单而实用:D – Manux22

0

我会使用LINQ创建一个单一的Func<string, string>执行一次性全部更新换代。

方法如下:

var replace = new Dictionary<string, string> 
{ 
    { "text1", "name" }, 
    { "text2", "Franco" } 
} 
    .Select(kvp => (Func<string, string>) 
     (x => x.Replace(String.Format("{{{0}}}", kvp.Key), kvp.Value))) 
    .Aggregate<Func<string, string>, Func<string, string>>(
     x => Regex.Replace(x, @"\{(\w+)\}", "null"), 
     (a, f) => x => a(f(x))); 

var result = replace("Hi, my {text1} is {text2} and {text3} and {text4}."); 

// result == "Hi, my name is Franco and null and null." 
+0

这对每个键/值对执行一次替换,所以它肯定不是“一气呵成”。而且,它不会用'“null”替换无法识别的键。哦,它也会留下括号。预期结果:'“嗨,我的{text1}是{text2}和{text3}。” - >“嗨,我的名字是佛朗哥,并且为空。”# –

+0

@LucasTrzesniewski - 对不起,我错过了这个问题中的几个要点。我已经更新了我的答案,并且我相信它的功能正常。 – Enigmativity

+0

@LucasTrzesniewski - 作为附加说明 - 我的解决方案将处理键值包含正则表达式特殊字符的情况。 – Enigmativity