用于解析SQL参数的正则表达式

7
如果我有一个查询,例如 SELECT * from authors where name = @name_param,是否有一个正则表达式来解析参数名称(特别是 "name_param")?
谢谢

不确定您具体要求什么。您能否澄清或举个例子吗?您想传入一个名称列表并将其转换为 WHERE name in (name_a,name_b,...) 吗?同时您需要指定关系型数据库管理系统(RDBMS),因为它们的正则表达式支持是不同的。 - Mark Brady
2个回答

9

这很棘手,因为params也可能出现在引号字符串中。

SELECT * FROM authors WHERE name = @name_param 
  AND string = 'don\'t use @name_param';

正则表达式如何知道使用第一个 @name_param 而不是第二个?

这是一个可以解决的问题,但在单个正则表达式中解决它并不实际。我曾经在 Zend_Db 中处理过这个问题,我的做法是首先去除所有带引号的字符串和定界符标识符,然后你就可以在剩余部分上使用正则表达式。

你可以查看代码,因为它是开源的。请查看函数 _stripQuoted()_parseParameters()

https://github.com/zendframework/zf1/blob/136735e776f520b081cd374012852cb88cef9a88/library/Zend/Db/Statement.php#L200 https://github.com/zendframework/zf1/blob/136735e776f520b081cd374012852cb88cef9a88/library/Zend/Db/Statement.php#L140


3
更不用说在 SQL 注释中出现的参数名称了。正则表达式很好用,但并不一定适合解析任务。 - Jonathan Leffler
很遗憾链接无法工作。我还在寻找一种排除引用字符串和注释的方法。 - Shinjo
1
@Shinjo 我已更新代码的当前位置链接。 - Bill Karwin

4

假设您没有带有参数的引号字符串或注释,所需的正则表达式将非常简单:

@([_a-zA-Z]+)       /* match group 1 contains the name only */

我赞同 Bill Karwin 的建议,谨慎行事,因为简单的方法有其缺陷。但是,如果您了解处理的数据,这个正则表达式就足够了。


小提示:参数名称中也可以包含数字,因此正则表达式应为@([_a-zA-Z0-9]+)。 - Samuel
3
@gissolved说的没错,但我认为参数不能以数字开头,甚至可能不能以下划线开头。因此,我会使用@([a-zA-Z] [a-zA-Z0-9 _] *) - bluish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接