2016-03-08 65 views
1

我有喜歡的部份字符串:C#正則表達式頂替記號化字符串

 string s = "{{hello {{User.Name}},thanks for your buying in {{Shop}}"; 

我怎麼可以用這樣的:

 IDictionary<string,string> vals=new Dictionary<string,string>() 
     { 
      {"User.Name","Jim" }, 
      {"Shop","NewStore" } 
     } 
     string result= Regex.Replace(s, @"{{.+}}", m => vals[m.Groups[1].Value]); 

,但它並沒有因爲正則表達式將整個字符串匹配(在前兩個{{實際上是字符串,而不是令牌)

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml- self-contained-tags /是匹配嵌套標籤對的傳統線程......通過闡明您認爲有效匹配的具體內容以及限制可能的嵌套,您將有機會讓某人在您的案例中提供具體的答案。 –

回答

1

我假設所有的鍵int int字典不包含{}字符。

要處理這種情況,請勿在{{.+}}匹配中使用..接受除\n之外的任何單個字符(以防您的正則表達式代碼)。

.替換爲[^\{\}],它們匹配除{}之外的任何字符。
而你應該在你的regex函數中逃避{},因爲它們在正則表達式中有特殊的含義。有些情況下,正則表達式會將它們視爲文字特徵,但在其他情況下不會。

要有m.Groups [1],您必須在()內包裝[^\{\}]+

最後,爲避免異常,請在替換之前檢查您的字典鍵是否包含上述Regex函數找到的字符串。

您的代碼可以像波紋管:

string s = "{{hello {{User.Name}}, thanks for your buying in {{Shop}}. This {{Tag}} is not found"; 

IDictionary<string, string> vals = new Dictionary<string, string>() 
{ 
    {"User.Name","Jim" }, 
    {"Shop","NewStore" } 
}; 

string result = Regex.Replace(s, @"\{\{([^\{\}]+)\}\}", 
    m => vals.ContainsKey(m.Groups[1].Value) ? vals[m.Groups[1].Value] : m.Value); 
Console.WriteLine(result); 

輸出:

{{hello Jim, thanks for your buying in NewStore. This {{Tag}} is not found 
+0

謝謝!它非常有幫助! – protoss