替换字符串中的占位符

时间:2019-04-02 11:25:54

标签: c# string macros

我有如下字符串:

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

3 个答案:

答案 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});

使用此解决方案,您不必使用复杂事物的正则表达式。

相关问题