替换嵌入式撇号,但只替换某些撇号(第2部分)

时间:2013-11-15 14:32:31

标签: c# sql regex string

实际上我现在已经意识到我昨天试图解决错误的问题(但是我一路上学到了一些有用的提示 - 感谢所有人)。

我的问题是我真的需要替换字符串中任何文字字符串中嵌入的撇号,例如

  

“和x ='o'reilly'和y ='o'reilly'和z ='一些带有'word here'的文字'”

成为

  

“和x ='o''reilly'和y ='o''reilly'和z ='一些带有''word'的文字''''

是的,这是准备从用户输入和其他来源动态构造的任意文本,以成为SQL查询的一部分。我不能依赖于我所期望的空间,也不能依赖于等号的任何一侧是否存在空格。

3 个答案:

答案 0 :(得分:1)

考虑以下内容来替换嵌入式'...

string output = Regex.Replace(" and x = 'o'reilly' and y = 'o'reilly' and z = 'some text with a 'word here' in it' ", @"(?<=\=\s*\'[\w\s]*?)\'(?=[\w\s]*?\')", @"""");

祝你好运!

以下是代码和输出的屏幕截图......

enter image description here

答案 1 :(得分:1)

我担心基本问题是不可能的。

你有一些形式:

and name1 = 'value1' [and name2 = 'value2' [...]]

值可能包含零个或多个撇号。

但是,除非不允许值包含等号,否则无法知道您给出的示例:

 and x = 'o'reilly' and y = 'o'reilly' and z = 'some text with a 'word here' in it'

应该解释。如果我们想这样做,请考虑一下:

  1. xo'reilly
  2. 进行比较
  3. yo'reilly
  4. 进行比较
  5. zsome text with a 'word here' in it
  6. 进行比较

    然后你最终会得到你的例子中的字符串。

    但是,如果我们想这样做:

    1. xo'reilly' and y = 'o'reilly
    2. 进行比较
    3. zsome text with a 'word here' in it
    4. 进行比较

      然后我们也会以你的例子中的字符串结束。

      (还有两个可能的请求也会导致完全相同的字符串)。

      代码的目的是将描述预期操作的一部分的字符串转换为执行该操作的代码。

      错误是字符串没有清楚地描述该操作。

      可以修复最可能的情况(值永远不会包含and foo = '),但一般解决方案是不可能的。你需要修复以这种方式序列化谓词的内容,因为这就是错误的位置。

      编辑:如果我们可以假设我们永远不会得到一个含糊不清的案例,那么我们可以利用:

      Regex.Replace(
        input,
        @"'(.*?)'(?=\s*(and\s+\S+\s*=\s*'|$))",
        m => "'" + m.Value.Substring(1, m.Value.Length - 2).Replace("'", "''") + '\''
      )
      

      然而,我只会将此作为最后的手段使用,同时提出一个错误来反对它已经完成的事实,因为它仍然存在我上面详述的问题,它只是可以做到的最好的事情。与此同时。

答案 2 :(得分:0)

此应用程序是否面向网络?我是一个SQL迷​​,我需要注入一些SQL。

换句话说,不要这样做!

找到另一种方法来做你想做的事情,例如使用参数化查询。

string query = "SELECT * FROM mytable WHERE x = @x AND y = @y AND z = @z";
// Assuming we have a connection object conn
SqlCommand command = new SqlCommand(query, conn); 
command.Parameters.AddWithValue("@x", "o'Reilly");
command.Parameters.AddWithValue("@y", "o'Reilly");
command.Parameters.AddWithValue("@z", "some text with a 'word here' in it");