заменить заполнители в строке - PullRequest
1 голос
/ 02 апреля 2019

У меня есть строки, как показано ниже:

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 ]

2 голосов
/ 02 апреля 2019

Если ваша строка уже имеет формат {variable}, тогда она идеально подходит для использования интерполяции строк :

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 к вашей базе данных.

0 голосов
/ 02 апреля 2019

Одно из решений может быть следующим: заменить {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");

С этим решением вам не нужно работать с регулярными выражениями сложных вещей.

0 голосов
/ 02 апреля 2019

Если вы получили вашу строку в переменной, вы должны выполнить интерполяцию самостоятельно

Для этого вам нужно найти все заполнители и заменить их значение.Вы можете сделать это с помощью регулярного выражения (может быть упрощено, если заполнитель может начинаться с цифр)

{(?<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 (идентификатор, имя, номер, адрес) значения (123, «Abc», 55668878, «тестовый адрес»);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...