2011-10-31 69 views
1

我是用简单的方法引用带引号的字符串中的文本。用单引号括起特定单词

例如:

DATEDIFF(Minutes, Lead.WhenCreated, @Today) 

需要的,如果源字符串是已经为令牌则没有变化应作出报价进行更新,以

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

。字符串中可能有多个标记,我不会知道标记值是什么 - 只能说它将以@字符开头。

我的环境是Visual Studio C#2008.

希望有人能帮上忙。

谢谢。

回答

0

模式:

(?<!')(@\w+) 

更换:

'$1' 
+0

谢谢Alexey,除了FailedDev的回答之外,这也起作用。 – dubs

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

您可以使用这个。它会查找以@开头的所有单词并向它们添加引号。

编辑:

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

为了说明已经带引号的字符串。

+0

干杯,作品一种享受。 – dubs

+0

一个小问题,如果源字符串确实包含引号(例如.DATEDIFF(Hours,Lead.WhenCreated,'@Today')),那么替换仍然会发生,即结果是:DATEDIFF(Hours,Lead.WhenCreated,'' @Today'') – dubs

+0

@JDubs查看更新后的答案。 – FailedDev

0

它看起来像你在C#代码中构建SQL语句,然后自己替换参数。您可能更适合使用此方法...

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注入更安全。

This is an article addressing the issue in C#

+0

Hi El Ronnoco,我明白你的意思,但所有的替换都将由数据库服务器执行,因为sql将由调度程序运行(即在未确定的时间) - 所以直到执行SQL时才会知道实际值。关于SQL注入点,我熟悉这一点,但也会检查出你的链接。 – dubs

+0

@J Dubs我认为你的应用程序本质上可能是注射安全的,但是它是一个很好的习惯,例如你的代码可能被其他人拷贝到WebService或Web应用程序中,在你知道它之前,bing-bada-boom ,[little bobby tables](http://xkcd.com/327/)捣毁你的后端:) –