2017-10-19 53 views
1

要找出哪个提交的SQL查询与LIMIT子句结束,我使用正则表达式如下较短的正则表达式:是有这种模式

re_end_has_limit = re.compile(
    r'LIMIT\s+(\d+|\(\d+\)|\(\s+\d+\)|\(\s+\d+\s+\))($|;$|\s+;$|\s+;\s+$)', 
    re.IGNORECASE) 

这符合以下&按预期工作。它匹配以下:

LIMIT 1 
LIMIT (1) 
LIMIT (1) 
LIMIT 1; 
LIMIT (1); 
LIMIT (1); 
LIMIT 1 ; 
LIMIT (1) ; 
LIMIT (1) ; 
LIMIT 1 ; 
LIMIT (1) ; 
LIMIT (1) ; 

注意:最后3项中包含一个尾随空格字符。

然而,看着正则表达式,我觉得有一种方法可以缩短它,但一直没有弄清楚。

+3

您可能想了解'*'和'?'。另外,你的正则表达式不匹配'LIMIT(1)'。 – melpomene

+0

感谢,在了解'*'之后,我得到了'pattern = r'LIMIT(\ s + \ d + | \ s * \(\ s * \ d + \ s * \))\ s *(; \ s * $ | $)'',在了解了'?'后,我达到了接受的答案。 –

回答

1

如何:

LIMIT(\s+\d+|\s*\(\s*\d+\s*\))\s*;?\s*$ 
-1

我不熟悉SQL查询,但看你的例子,我认为这应该努力找到所有LIMIT子句:

re_end_has_limit = re.compile(r'LIMIT[ \(]+\d', re.g) 
+0

@melpomene:我已更正了与您的新示例不匹配的答案。 – mrCarnivore

+0

匹配'SELECT'SKY是LIMIT(1 2 3)'FROM DUAL'。 – melpomene

+0

我放弃了......这些限制从原来的问题来看并不明显!此外,其他答案无法正常工作,当在regex101上尝试它们时... – mrCarnivore

0

这也是一种选择:

LIMIT\s*(\()?\s*\d+\s*(?(1)\))\s*;?\s*$ 

regex101

而不是使用或(|),就像接受的答案一样,它使用if((?(1)...)