2016-03-08 3 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]); 

, но это не потому, что регулярное выражение будет соответствовать целой строки (The первые два {{фактически в строке, а не токен)

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml- self-contains-tags/является традиционным потоком для сопоставления вложенных пар тегов ... Поясняя, что именно вы считаете правильным совпадением и ограничивая возможное вложение, вы дадите шанс кому-то дать конкретный ответ в вашем случае. –

ответ

1

Я предполагаю, что все ключи в вашем словаре vals не содержат { и } символов.

Чтобы справиться с этим делом, не используйте . в матче {{.+}}. . принимает любой символ кроме \n (в случае вашего кода регулярного выражения).

Замените . на [^\{\}], которые соответствуют любым символам, кроме { и }.
И вы должны избегать { и } в своей функции регулярного выражения, потому что они имеют особое значение в Regex. В некоторых случаях 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

Смежные вопросы