Заключайте определенные слова в одинарные кавычки

#c# #.net #regex

#c# #.net #регулярное выражение

Вопрос:

Я ищу простое решение для цитирования текста в строке с кавычками.

Например:

 DATEDIFF(Minutes, Lead.WhenCreated, @Today)
 

необходимо обновить, чтобы

 DATEDIFF(Minutes, Lead.WhenCreated, '@Today')
 

Если исходная строка уже содержит кавычки для токена, никаких изменений вносить не следует. В строке может быть несколько токенов, и я не буду знать, каким будет значение токена — только сказать, что оно будет начинаться с символа @ .

Моя среда — Visual Studio C # 2008.

Надеюсь, что некоторые могут помочь.

Спасибо.

Ответ №1:

 resultString = Regex.Replace(subjectString, @"(@bw b)", "'$1'");
 

Вы можете использовать это. Он найдет все слова, начинающиеся с @, и добавит к ним кавычки.

Редактировать :

 resultString = Regex.Replace(subjectString, @"((?<!')@bw b)", "'$1'");
 

Для учета уже заключенных в кавычки строк.

Комментарии:

1. Одна небольшая проблема, если исходная строка содержит кавычки (например. DATEDIFF(часы, время ожидания. При создании ‘@Today’) ) тогда замена все равно происходит, т.е. Результат таков: DATEDIFF (часы, время ожидания. При создании, «@Today»)

Ответ №2:

Шаблон:

 (?<!')(@w )
 

Замена:

 '$1'
 

Комментарии:

1. Спасибо, Алексей, это также работает в дополнение к ответу FailedDev.

Ответ №3:

Похоже, что вы создаете инструкцию SQL в коде C #, а затем самостоятельно заменяете параметры. Вероятно, вам лучше использовать этот метод…

 DataReader rdr;
using (SqlConnection con = new SqlConnection(MY_CONNECTIONSTRING)
{
    con.Open();
    string sql = "SELECT DATEDIFF(Minutes, Lead.WhenCreated, @Today) FROM tbl";
    using (SqlCommand cmd = new SqlCommand(sql, con))
    {
         cmd.Parameters.AddWithValue("@Today", datDateValue);
         rdr = cmd.ExecuteReader();
    }
}
 

Этот метод более безопасен против вредоносной SQL-инъекции.

Это статья, посвященная проблеме на языке Си#

Комментарии:

1. Привет, Эль Ронноко, я понимаю вашу точку зрения, но вся замена будет выполняться сервером базы данных, поскольку sql будет выполняться планировщиком (т. Е. В неопределенное время), поэтому фактическое значение не будет известно до тех пор, пока SQL не будет выполнен. Что касается SQL-инъекции, я знаком с этим, но также проверю вашу ссылку.

2. @J Dubs Я подумал, что ваше приложение, вероятно, по своей сути безопасно для инъекций, однако это хорошая привычка, например, ваш код может быть скопирован в веб-сервис или веб-приложение кем-то другим, и, прежде чем вы это узнаете, bing-bada-boom, little bobby tables разрушает ваш сервер 🙂