正则表达式解析sql过滤器

时间:2012-02-08 19:15:39

标签: javascript regex

我正在尝试解析sql server WHERE子句的不同过滤字符串,我认为正则表达式是可行的方法。幸运的是,过滤器将始终是平的,不会有“子过滤器”。每个过滤器语句将始终用括号括起来。这是我要解析的字符串示例:

([IsActive]=(1)) AND ([NoticeDate] >= GETDATE()) AND (NoticeDate <= DATEADD(day, 90, GETDATE()))

我想要的结果是一个包含以下项目的数组:

[0] = ([IsActive]=(1)) AND
[1] = ([NoticeDate] >= GETDATE()) AND
[2] = (NoticeDate <= DATEADD(day, 90, GETDATE()))

我最接近的是以下正则表达式:

/\(.+?\) (and|or)/i

但这只会返回

[0] = ([IsActive]=(1)) AND
[1] = AND

所以基本上我想要返回括号中包围的任何内容,后跟一个空格,后跟字符串“and”或“or”。最后一个语句后面跟不会和/或,虽然我可以连接一个“和”字符串,如果这样可以更容易。这是使用经典的asp JScript完成的。我已经筋疲力尽了我的(弱)正则表达能力,任何帮助都会非常感激。提前致谢

3 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

(?i)\(.+?\)(?:\s+(?:and|or)|$)

输出:

enter image description here

答案 1 :(得分:0)

如果你的WHERE子句是自由格式的,/\(.+?\) (and|or)/i将虚假地匹配内部标记,如字符串和注释。

考虑

SELECT resting_place FROM Nation
WHERE date_founded LIKE "Four score and seven years ago"
AND conceived IN (liberty)
ORDER BY the_people

and中的"Four score and seven years"不是SQL关键字,但单个正则表达式方法无法区分关键字使用和非关键字使用。

答案 2 :(得分:0)

更强大的方法可能是做一个合适的解析器。这应该适用于经典的LL(1)解析器。周围有很多解析器生成器。事实上,人们可以很容易地将正则表达式视为一种解析器生成器。

无论如何,对于这种任务,一个合适的LL(1)解析器可能是更好的主意。如果你愿意的话,它也可以支持嵌套术语。

https://en.wikipedia.org/wiki/LL_parser