C#正则表达式替换标记化字符串

时间:2016-03-08 02:08:03

标签: c# regex

我有一个类似的字符串:

       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]);

但它没有,因为正则表达式将匹配整个字符串(前两个{{实际上是字符串,而不是标记)

1 个答案:

答案 0 :(得分:1)

我认为vals词典中的所有键都不包含{}字符。

要处理此案例,请勿在{{1​​}}匹配中使用.{{.+}}接受除.之外的任何单个字符(如果是正则表达式代码)。

\n替换为.,其中包含除[^\{\}]{以外的任何字符。

你应该在正则表达式函数中转义}{,因为它们在正则表达式中具有特殊含义。有些案例正则表达式将它们视为文字特征,但在其他情况下则不然。

要拥有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);