我使用以下正则表达式来查找SQL参数,但在某些情况下它不起作用。
\@([^=<>\s]+)((?=\s)|$)
如果我使用此SQL查询,
select count(1) from (select * from tblEmailList109 where firstname='@FirstName') t
返回的值是:
@Firstname')
如何修改正则表达式以停止停止但不包含单引号,空格或字符串的结尾?
我的目的是在将参数传递给SQL服务器之前替换它。我知道在带有参数的普通存储过程中使用单引号不是必需的,但在我的情况下,当我进行替换时,在发送到SQL服务器时需要字符串文字的引号。
由于
答案 0 :(得分:5)
很大程度上基于Hunter McMillen的研究,以下内容符合所有标准:
\@([\w.$]+|"[^"]+"|'[^']+')
您的正则表达式正在捕获尾随')
,因为这两个字符都包含在您的角色类[^=<>\s]
我还想指出你的正则表达式的后半部分什么都不做
(|(?=\s)|$)
^^
您有三种选择(格式为(a|b|c)
)以匹配此处:
中间一个(?=\s)
匹配下一个字符是空格的位置,$
匹配输入的结尾,但第一个替代(标有^^
)表示无匹配。因此,交替将始终匹配,因为每个角色之间没有任何匹配。
答案 1 :(得分:2)
不确定您使用的SQL,但是来自MySQL文档:
用户变量写为@var_name,其中包含变量名称 var_name由字母数字字符“。”,“_”和“$”组成。 如果您将其引用为,则用户变量名称可以包含其他字符 字符串或标识符(例如,@'my-var',@“my-var”,或 @
my-var
)。
因此有两件事可以检查:
\@[\w\.\$]+
第二次检查会返回一些误报,因为它会匹配不以相同的引号类型开头和结尾的字符串,但它更简单,你的SQL编辑器会抱怨引号类型不匹配。
答案 2 :(得分:1)
如果您将一个转义的撇号添加到忽略列表中,它适用于您的测试用例。
\@([^=<>\s\']+)
答案 3 :(得分:1)
我会使用正则表达式
@(?:[\w#_$]{1,128}|(?:(\[)|").{1,128}?(?(1)]|"))
它会找到@
后跟其中任何一个:
#
,_
,$
和字母数字字符。[]
或""
中最多包含128个字符。您可以在此处找到完整的说明和演示:http://regex101.com/r/nY1pR0