我有如下字符串:
Insert into Emp(Id,Name,Number,Address) values({Id},"Abc",{Number},{Address});
在上面的字符串{Id}
中,{Number}
和{Address}
是占位符,我想用一些值替换。
我想要字符串中的占位符列表,并且想轻松地将其替换为实际值。
输出应如下所示:
Insert into Emp(Id,Name,Number,Address) values(123,'Abc',55668878,'test address');
答案 0 :(得分:2)
如果您的字符串已经采用{variable}
的格式,则非常适合使用string interpolation:
var Id=1, Number=2;
var Address = "Some address";
string str = $"Insert into Emp(Id,Name,Number,Address) values({Id},\"Abc\",{Number},{Address});"
另一种选择是,如果您有很多这样的字符串,并且每个字符串都有自己的占位符集合,则可以迭代该占位符集合,并在占位符和所需值之间使用string.Replace
(例如,如果此占位符集合为查找表,键为占位符字符串,值为期望值。
但是,我真的鼓励您不要使用这种方法来创建查询。这是有风险的,因为它容易受到SQL注入的攻击。取而代之的是使用参数化查询,或者更好的是对数据库使用一些ORM。
答案 1 :(得分:0)
如果您在变量中收到字符串,则应该自己进行插值
为此,您需要找到所有占位符并替换它们的值。您可以使用正则表达式(如果占位符可以以数字开头,则可以简化此操作)
{(?<placeholder>[a-z_][a-z0-9_]*?)}
下一个方法将执行此替换:
public static string Replace(string input, Dictionary<string, object> replacement)
{
var regex = new Regex("{(?<placeholder>[a-z_][a-z0-9_]*?)}",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
return regex.Replace(input, m =>
{
var key = m.Groups["placeholder"].Value;
if (replacement.TryGetValue(key, out var value))
return value.ToString();
throw new Exception($"Unknown key {key}");
});
}
用法:
var input = "Insert into Emp(Id,Name,Number,Address) values({Id},\"Abc\",{Number},{Address});";
var replaces = new Dictionary<string, object>
{
{"Id", 123},
{ "Number", 55668878},
{"Address", "\"test address\"" },
};
var result = Replace(input, replaces);
Console.WriteLine(result);
输出:
插入Emp(Id,Name,Number,Address)值(123,“ Abc”,55668878,“测试地址”);
答案 2 :(得分:0)
一个解决方案可能是这样的: 像这样将{Id},{Number},{Address}替换为{0},{1},{2}。
true
然后您执行此操作:
Insert into Emp(Id,Name,Number,Address) values({0},"Abc",{1},{2});
使用此解决方案,您不必使用复杂事物的正则表达式。