使用正则表达式在字符串中查找sql​​参数

时间:2014-01-22 15:11:41

标签: regex

我使用以下正则表达式来查找SQL参数,但在某些情况下它不起作用。

\@([^=<>\s]+)((?=\s)|$)

如果我使用此SQL查询,

select count(1) from (select * from tblEmailList109 where firstname='@FirstName') t

返回的值是:

@Firstname')

如何修改正则表达式以停止停止但不包含单引号,空格或字符串的结尾?

我的目的是在将参数传递给SQL服务器之前替换它。我知道在带有参数的普通存储过程中使用单引号不是必需的,但在我的情况下,当我进行替换时,在发送到SQL服务器时需要字符串文字的引号。

由于

4 个答案:

答案 0 :(得分:5)

很大程度上基于Hunter McMillen的研究,以下内容符合所有标准:

\@([\w.$]+|"[^"]+"|'[^']+')

Working example

您的正则表达式正在捕获尾随'),因为这两个字符都包含在您的角色类[^=<>\s]

我还想指出你的正则表达式的后半部分什么都不做

(|(?=\s)|$)
^^

您有三种选择(格式为(a|b|c))以匹配此处:

中间一个(?=\s)匹配下一个字符是空格的位置,$匹配输入的结尾,但第一个替代(标有^^)表示无匹配。因此,交替将始终匹配,因为每个角色之间没有任何匹配。

答案 1 :(得分:2)

不确定您使用的SQL,但是来自MySQL文档:

  

用户变量写为@var_name,其中包含变量名称   var_name由字母数字字符“。”,“_”和“$”组成。   如果您将其引用为,则用户变量名称可以包含其他字符   字符串或标识符(例如,@'my-var',@“my-var”,或   @ my-var)。

因此有两件事可以检查:

  1. 仅限字母数字,下划线,句号和美元符号:\@[\w\.\$]+
  2. 引用的任何内容:\ @ [“'`]。* [”'`]
  3. 第二次检查会返回一些误报,因为它会匹配不以相同的引号类型开头和结尾的字符串,但它更简单,你的SQL编辑器会抱怨引号类型不匹配。

答案 2 :(得分:1)

如果您将一个转义的撇号添加到忽略列表中,它适用于您的测试用例。

\@([^=<>\s\']+)

答案 3 :(得分:1)

我会使用正则表达式

@(?:[\w#_$]{1,128}|(?:(\[)|").{1,128}?(?(1)]|"))

它会找到@后跟其中任何一个:

  • 最多128个#_$和字母数字字符。
  • 分隔符[]""中最多包含128个字符。

您可以在此处找到完整的说明和演示:http://regex101.com/r/nY1pR0