2012-02-08 98 views
1

我想解析SQL Server WHERE子句的不同过滤器字符串,我认为正则表达式应该是要走的路。幸运的是,过滤器将永远是平坦的,不会有“子过滤器”。每个过滤器语句将始终包围在括号中。这是我想解析字符串的例子:解析SQL过滤器的正则表达式

([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

试试这个正则表达式:

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

输出:

enter image description here

+0

这是给我指着一个语法错误(我) – 2012-02-08 19:33:41

+0

@WillP,这是忽略大小写选项。尝试使用'/ i'来代替。 – 2012-02-08 19:36:51

+0

我只是得到第一个返回使用http://www.cyber-reality.com/regexy.html – 2012-02-08 19:41:21

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 

"Four score and seven years"and不是SQL关键字,而是一个正则表达式的方法是不会能够区分关键字与非关键字的用途使用。

0

更健壮的方法可能是做一个合适的解析器。这应该可以通过经典的LL(1)解析器来实现。周围有很多解析器生成器。实际上,我们可以很容易地将正则表达式视为一种解析器生成器。

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

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