2015-01-07 190 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