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

Chr*_*ris 8 regex

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

\@([^=<>\s]+)((?=\s)|$)
Run Code Online (Sandbox Code Playgroud)

如果我使用这个SQL查询,

select count(1) from (select * from tblEmailList109 where firstname='@FirstName') t
Run Code Online (Sandbox Code Playgroud)

返回的值是:

@Firstname')
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

OGH*_*aza 5

基于Hunter McMillen的研究,以下内容可满足所有标准:

\@([\w.$]+|"[^"]+"|'[^']+')
Run Code Online (Sandbox Code Playgroud)

工作实例

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

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

(|(?=\s)|$)
^^
Run Code Online (Sandbox Code Playgroud)

你有3个替代方案(格式(a|b|c))在这里匹配:

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


Dun*_*ney 4

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

\@([^=<>\s\']+)
Run Code Online (Sandbox Code Playgroud)

  • 正如我在上面的评论中试图暗示的那样,这个正则表达式的后半部分实际上什么也没做 (2认同)