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