我有一个类似的字符串:
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 :(得分: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);