【问题标题】:replace placeholders in string替换字符串中的占位符
【发布时间】:2019-04-02 11:25:54
【问题描述】:

我有如下字符串:

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

【问题讨论】:

  • 看看字符串插值。但!更好的是 - 只需使用参数化查询或一些 ORM 来管理对数据库的查询
  • 如果这都是关于 SQL 语句的,我几乎不建议使用参数来避免 SQL 注入。
  • 是代码需求。
  • 是SQL的问题吗?或 C# 字符串插值问题。
  • 附带说明 - 将其称为占位符而不是宏更正确

标签: c# string macros


【解决方案1】:

如果您的字符串已经是{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。

【讨论】:

  • 猜你忘了用$替换@;)
  • @MightyBadaboom - 不 :) 只是一个错字,但感谢您指出哈哈
  • 这很好,但首先我想要占位符列表,因此我想更改值。
  • 好的,喜欢你的推荐。还有一个问题如何将 $ 应用于字符串变量?我得到的查询在字符串变量中。
  • @Milanchavda - 不确定,因为我需要先查看相关代码。但这是一个后续问题,应该是单独的 SO 问题的一部分。请尝试在谷歌上搜索,看看之前是否有关于此事的问题
【解决方案2】:

如果你在变量中收到你的字符串,你应该自己做插值

为此,您需要找到所有占位符并替换它们的值。您可以使用正则表达式来做到这一点(如果占位符可以以数字开头,则可以简化)

{(?<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,"test address");

【讨论】:

    【解决方案3】:

    一个解决方案可能是这样的: 您将 {Id}、{Number}、{Address} 替换为 {0}、{1}、{2},如下所示。

    Insert into Emp(Id,Name,Number,Address) values({0},"Abc",{1},{2});
    

    然后你这样做:

    myString = string.Format(myString, "123", "55668878", "test address");
    

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

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多